GPPG (бизон) - как реализовать концепцию «выражения выражения» - PullRequest
0 голосов
/ 31 мая 2011

Мы используем GPPG (по сути, бизон для C #) для генерации парсера для языка программирования.Все идет отлично, за исключением одного действительно неприятного кусочка.Язык, который мы анализируем, имеет своего рода правило «неявного сравнения», где «выражение-выражение» следует интерпретировать как «выражение == выражение».

Например, это совершенно правильное утверждение:

 If SomeValue False Then
 EndIf

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

Вот очень маленькая грамматика, которая показывает конфликт, который я имеюи как я пытался ее решить, не работает, хотя

%start program
%token <Token> Plus
%token <Token> Times
%token <Constant> Constant

%left Plus
%left Times
%left IMPLICIT_COMPARISON

%%

program: expression;

expressionBase: Constant
    | expression Plus expression
    | expression Times expression;

expression: expressionBase
    | expression expressionBase %prec IMPLICIT_COMPARISON;

%%

Любая помощь будет принята с благодарностью

1 Ответ

1 голос
/ 31 мая 2011

Как насчет этого:

program: expression;

expressionBase: Constant
    | expressionBase Plus expressionBase
    | expressionBase Times expressionBase;

expression: expressionBase 
    | expressionBase expression;

Вам нужно строить грамматику снизу вверх, не смешивая ваши низкоуровневые концепции (например, expressionBase) и высокоуровневые (например, expression). Высокоуровневые построены с низкоуровневыми. Если вам это нужно с другой стороны, вы должны четко разграничить концепцию высокого уровня скобками или чем-то подобным, как показано ниже:

expressionBase: Constant
    | expressionBase Plus expressionBase
    | expressionBase Times expressionBase
    | LeftParen expression RightParen;

Фактические правила довольно сложны, но это поможет вам начать.

...