如何在Xtext的变量名中使用连字符'-'且避免与->运算符冲突
支持带连字符变量名的Xtext语法问题解决方案
问题根源
- Xtext词法分析器遵循终端规则优先级高于语法字面量、同层级终端规则按定义顺序优先匹配先声明规则的逻辑
- 你当前将
->直接写在语法规则中作为字面量,没有显式定义为独立终端规则,词法分析时不会优先识别该运算符 - ID规则允许变量名中间包含
-,词法分析时会优先将x后的-判定为变量名的一部分,导致x->y被拆分为x-、>、y,无法匹配->运算符
修正方案
- 显式将
->定义为独立终端规则,并且放在ID终端规则的前面,保证其优先级高于ID匹配 - 替换语法规则中原先的
->字面量为新定义的终端规则名
修正后的完整语法代码
grammar org.xtext.example.mydsl.MyDsl hidden(WS) import "http://www.eclipse.org/emf/2002/Ecore" as ecore generate myDsl "http://www.xtext.org/example/mydsl/MyDsl" Model: lines+=Line* ; Line: (Variable | Expression) '.' ; Variable: name=ID ; Expression: '=' Atomic ({LinkedExpression.leftOperand=current} op=ARROW rightOperand=Atomic)* ; Atomic returns Expression: ref=[Variable] ; // 箭头运算符终端规则必须放在ID规则前面,保证优先级更高 terminal ARROW: '->'; terminal ID: ('a'..'z'|'A'..'Z')(('a'..'z'|'A'..'Z'|'0'..'9'|'-')*('a'..'z'|'A'..'Z'|'0'..'9'))?; terminal INT: ('0'..'9')+; terminal WS: (' '|'\t'|'\r'|'\n')+;
验证效果
修改后所有测试用例均可正常解析:
- 带连字符的变量名如
m-n可以正常识别 - 无空格分隔的
=x->y.、=m-n->y.会被正确分词为=、变量名、->、变量名、.,匹配表达式规则
内容的提问来源于stack exchange,提问作者mzattera
相关产品推荐
相关产品推荐

