我在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
;
除了“基数”分配外,一切正常。
表达式看起来像这样:
文本编号(3) - (任意数量的字母后跟正好3个数字)
符号编号(2->) - (任意数量的特殊字符后跟至少2个数字)
空格数( - > 4) - (任意数量的空格,后跟最多4个数字)
数字(3-> 6) - (至少3个数字但不超过6个)
当我使用这种语法运行Eclipse时(这样我的语言被识别并且代码完成等等),我输入的所有内容都显示在“Outline” - tab中,作为树结构,除了它基数值。
当我向CharMatcher添加基数声明时,会在它之前显示小加号,但是当我点击它时它就会消失。
有谁能告诉我为什么这不起作用?
答案 0 :(得分:0)
我自己找到了解决方案,我认为问题在于编译器无法决定在此时创建哪个类:
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;
它仍未显示在“Outline”-Tab中,但我认为这是可视化问题。
现在生成的类按预期工作。