Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Разрешение конфликта reduce / reduce в yacc / ocamlyacc
Я пытаюсь разобрать grammar в ocamlyacc (почти то же самое, что и обычный yacc), который поддерживает приложение функций без операторов (например, в Ocaml или Haskell) и обычный набор двоичных и унарных операторов. Я получаю конфликт reduce/reduce с оператором' -', который может использоваться как для вычитания, так и для отрицания. Вот пример grammar, который я использую:
%token <int> INT
%token <string> ID
%token MINUS
%start expr
%type <expr> expr
%nonassoc INT ID
%left MINUS
%left APPLY
%%
expr: INT
{ ExprInt $1 }
| ID
{ ExprId $1 }
| expr MINUS expr
{ ExprSub($1, $3) }
| MINUS expr
{ ExprNeg $2 }
| expr expr %prec APPLY
{ ExprApply($1, $2) };
Проблема заключается в том, что когда вы получаете выражение типа "a - b", парсер не знает, следует ли его уменьшить как "a (-b)" (отрицание b, а затем применение) или "a - b" (вычитание). Уменьшение вычитания является правильным. Как мне разрешить конфликт в пользу этого правила?
К сожалению, единственный ответ, который я могу придумать, означает увеличение сложности grammar.
- разделить
exprнаsimple_exprиexpr_with_prefix - разрешить только
simple_exprили(expr_with_prefix)в APPLY
Первый шаг превращает ваш конфликт reduce/reduce в конфликт shift/reduce,но скобки решают эту проблему.
У вас будет та же проблема с "A b c": это a(b(c)) или (a(b))(c) ? Вам также нужно будет разорвать applied_expression и обязательный (applied_expression) в grammar.
Я думаю, что это поможет, но я не уверен:
expr := INT
| parenthesized_expr
| expr MINUS expr
parenthesized_expr := ( expr )
| ( applied_expr )
| ( expr_with_prefix )
applied_expr := expr expr
expr_with_prefix := MINUS expr
Ну, этот самый простой ответ состоит в том, чтобы просто игнорировать его и позволить по умолчанию уменьшить/уменьшить разрешение обрабатывать его-уменьшить правило, которое появляется первым в grammar. В данном случае это означает уменьшение предпочтения expr MINUS expr до MINUS expr, что именно то , что вы хотите. Увидев a-b, вы хотите разобрать его как двоичный минус, а не унарный минус, а затем применить.