грамматика зубров / йаск - PullRequest
1 голос
/ 24 мая 2011

У меня есть следующая грамматика бизонов (как часть более сложной грамматики): expression: IDENTIFIER | CONST | LAMBDA match_block ; match_block: pattern '=' expression | match_block '|' pattern '=' expression ; pattern: IDENTIFIER | CONST ; , которая описывает выражения, содержащие идентификаторы, константы и лямбда-функции с сопоставлением с образцом, который выглядит следующим образом:
lambda 0 = 1 | 1 = 2 | x = x Проблема в 1 смене/ уменьшить конфликт, вызванный неоднозначностью с вложенными совпадениями, как в следующем примере: lambda 0 = 1 | x = lambda 1 = 2 | y = 4 Правило состоит в том, что блок сопоставления относится к ближайшей функции, как показано с отступом в примере выше.

Мои вопросы - как я могу переписатьэту грамматику, чтобы устранить эту двусмысленность (без использования директив% left% right yacc)?

1 Ответ

2 голосов
/ 25 мая 2011

Если вы всегда хотите, чтобы | связывался с ближайшим LAMBDA, это в основном означает, что вы можете иметь только LAMBDA в предложении LAST | из match_block:

non_lambda_expression:
    IDENTIFIER
    | CONST
;
expression:
    non_lambda_expression
    | LAMBDA match_block
;
non_lambda_match_block:
    pattern '=' non_lambda_expression
    | non_lambda_match_block '|' pattern '=' non_lambda_expression
;
match_block:
    pattern '=' expression
    | non_lambda_match_block '|' pattern '=' expression
;
pattern:
    IDENTIFIER
    | CONST
;

По сути, вы разделяете expression и match_block на две версии - одну, в которой разрешены лямбды, и другую, в которой нет - и используете соответствующую в каждом месте, чтобы избежать неоднозначности.

...