【问题标题】:Xtext: Using syntactic predicates with cross-referenceXtext:使用具有交叉引用的句法谓词
【发布时间】:2017-01-12 15:41:33
【问题描述】:

我无法理解如何使用句法谓词。

我的语法是:

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

这会产生非 LL(*) 冲突。

我试图把'=>'放在前面:

(anotherField=RuleTwo TOK_SEMI)

但这似乎没有帮助。

如何用句法谓词解决它?

谢谢。

【问题讨论】:

  • 能不能给出一个完整的最小复现语法
  • 好吧,什么语法相当庞大,

标签: grammar predicate xtext cross-reference


【解决方案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;

【讨论】:

    猜你喜欢
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多