【问题标题】:xText Variable/Attribute AssignmentxText 变量/属性分配
【发布时间】:2012-07-04 15:30:40
【问题描述】:

我在 xText 中构建了一个语法来识别特定格式的正式表达式 并在 Java 中使用生成的对象树。
这是它的样子:

grammar eu.gemtec.device.espa.texpr.Texpr with org.eclipse.xtext.common.Terminals

generate texpr "http://www.gemtec.eu/device/espa/texpr/Texpr"

Model:
    (expressions+=AbstractExpression)*  
;

AbstractExpression:
    MatcherExpression | Assignment;

MatcherExpression:
    TerminalMatcher ({Operation.left=current} operator='or' right= MatcherExpression)?
;

TerminalMatcher returns MatcherExpression:
    '(' MatcherExpression ')' | {MatcherLiteral} value=Literal
;

Literal:
    CharMatcher | ExactMatcher
;

CharMatcher:
    type=('text'|'number'|'symbol'|'whitespace') ('(' cardinality=Cardinality ')')?
;

/* Kardinalitäten für CharMatcher*/
Cardinality:
    CardinalityMin | CardinalityMinMax | CardinalityMax| CardinalityExact
;
CardinalityMin:         min=INT '->';
CardinalityMinMax:      min=INT '->' max=INT;
CardinalityMax:                 '->' max=INT;
CardinalityExact:       exact=INT;

ExactMatcher:
    (ignoreCase='ignoreCase''(' expected=STRING ')') | expected=STRING
;

/* Variablenzuweisung 
 * 
 * z.B. $myVar=number
 * */
Assignment:
    '$' name=ID '=' expression=MatcherExpression
;

除了“基数”分配外,一切正常。

表达式如下所示:
text number(3) - (任意数量的字母,后跟正好 3 个数字)
符号编号(2->) - (任意数量的特殊字符,后跟至少 2 个数字)
空格数(->4) - (任意数量的空格,后跟最多 4 个数字)
number(3->6) - (至少 3 个数字但不超过 6 个)

当我使用此语法运行 Eclipse(以便我的语言被识别并具有代码完成等)时,我键入的所有内容都在“大纲”选项卡中显示为应有的树结构,除了基数值。
当我向 CharMatcher 添加基数语句时,小加号出现在它之前,但当我单击它时它就消失了。

谁能告诉我为什么这不起作用?

【问题讨论】:

    标签: variable-assignment xtext


    【解决方案1】:

    我自己找到了解决方案,我认为问题在于编译器此时无法决定要创建哪个类:

    Cardinality:
    CardinalityMin | CardinalityMinMax | CardinalityMax| CardinalityExact
    ;
    
    CardinalityMin:         min=INT '->';
    CardinalityMinMax:      min=INT '->' max=INT;
    CardinalityMax:                 '->' max=INT;
    CardinalityExact:       exact=INT;
    

    所以我把整个事情简化了一点,现在看起来像这样:

    Cardinality:
        CardinalityMinMax | CardinalityExact
    ;
    
    CardinalityMinMax:  (min=INT '..' max=INT) | (min=INT '..') | ('..' max=INT);
    CardinalityExact:   exact=INT;
    

    它仍然没有显示在“大纲”选项卡中,但我认为这是可视化的问题。
    生成的类现在可以按预期工作。

    【讨论】:

    • 是的,我遇到了同样的问题并应用了同样的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 2011-09-07
    • 2016-09-27
    • 2021-12-02
    • 1970-01-01
    • 2012-02-12
    • 2016-12-24
    • 1970-01-01
    相关资源
    最近更新 更多