Сдвиг бизонов / уменьшение конфликтов с помощью анонимного вызова функций - PullRequest
0 голосов
/ 13 марта 2019

Мой язык допускает объявление анонимных функций, например (x: int):int => { return x * x - x }. Чтобы позвонить, просто напишите (expression). Но я также должен заключить в скобки выражение для приоритета, например x*(y+z).

Теперь бизон вызывает сдвиг / уменьшение конфликт для анонимного вызова функции с одним аргументом .

Вот часть раздела грамматики:

expr: ID %prec LOW
    | ID '=' expr %prec LOW
    | ID '(' ')'
    | ID '(' call_args ')'
    | '(' call_args ')' // anonymous function call
    | '(' ')'           // anonymous function call without arg
    | '(' expr ')'      // expression enclosed, like '(y+z)' in 'x*(y+z)'
    | expr op_arithematic expr %prec HIGH
    | expr op_comparison expr %prec HIGH 
    | numeric

call_args: expr
    | call_args ',' expr

Конфликтующий вывод:

State 31

   31 expr: '(' expr . ')'
   32     | expr . op_arithematic expr
   33     | expr . op_comparison expr
   37 call_args: expr .
    ...
    ...
    ...
    ')'  shift, and go to state 61

    ')'       [reduce using rule 37 (call_args)]
    $default  reduce using rule 37 (call_args)

Я также добавил %prec без везения:

expr: ID %prec LOW
    | ID '=' expr %prec LOW
    | ID '(' ')'
    | ID '(' call_args ')'
    | '(' call_args ')'  %prec HIGH // anonymous function call
    | '(' ')'                       // anonymous function call without arg
    | '(' expr ')'       %prec LOW  // expression enclosed, like '(y+z)' in 'x*(y+z)'
    | expr op_arithematic expr %prec HIGH
    | expr op_comparison expr %prec HIGH 
    | numeric

call_args: expr
    | call_args ',' expr

Мне больно разрешать вызывать анонимную функцию, подобную этой, но я не могу избежать ее реализации, потому что это мое лабораторное задание. Я не нашел способа решить эту проблему.

...