Xtext: использование синтаксических предикатов с перекрестной ссылкой

Мне сложно понять, как использовать синтаксические предикаты.

Моя грамматика:

Rule:
    'terminalOne' (name=ID ':')?
    (field='terminalTwo' | myReference=[Something])? (anotherField=RuleTwo TOK_SEMI);

Это приводит к конфликту не-LL (*).

Я попытался поставить '=>' перед:

(anotherField=RuleTwo TOK_SEMI)

Но, похоже, это не помогает.

Как я могу решить эту проблему с помощью синтаксических предикатов?

Спасибо.


person John Benedetto    schedule 05.09.2016    source источник
comment
Можете ли вы дать полную минимальную воспроизводящую грамматику   -  person Christian Dietrich    schedule 05.09.2016
comment
ну какая грамматика довольно большая,   -  person Christian Dietrich    schedule 05.09.2016


Ответы (1)


я немного сократил (ваш способ левого факторинга выглядит очень необычно

RuleA:
    'terminalA' (name=ID ':')?
    ((->fieldA=ID passedParams+=AdditiveExpression (',' passedParams+=AdditiveExpression)*)
    |
    ((fieldB='t' | fieldC='q')? (fieldD=AdditiveExpression ";")));


AdditiveExpression returns BExpression :
    RuleB
    ({BBinaryOpExpression.leftExpr=current} functionName=("+" | "-") rightExpr=RuleB)*
    ;

RuleB returns BExpression
    : PostopExpression 
    | RuleC
    ; 

RuleC returns BExpression : {BUnaryOpExpression} 
    functionName="-" expr=UnaryOrPrimaryExpression
    ;

PostopExpression returns BExpression :
    PrimaryExpression ({BUnaryPostOpExpression.expr=current} functionName = ("++"))?
    ;

PrimaryExpression returns BExpression:
    c=constant
  | myID=ID '(' myFieldB+=AdditiveExpression (',' myFieldB+=AdditiveExpression)* ')'
    | myP=ID (operator+='['intvalue=INT operator+=']')?
    | operator+='(' additiveExpression=AdditiveExpression operator+=')'
    | operator+='someOperator' operator+='(' additiveExpression=AdditiveExpression operator+=')';


constant:
    booleanValue='FALSE'
    | booleanValue='TRUE'
    | integerValue=INT;
person Christian Dietrich    schedule 05.09.2016