You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Xtext的变量名中使用连字符'-'且避免与->运算符冲突

支持带连字符变量名的Xtext语法问题解决方案

问题根源

  • Xtext词法分析器遵循终端规则优先级高于语法字面量、同层级终端规则按定义顺序优先匹配先声明规则的逻辑
  • 你当前将->直接写在语法规则中作为字面量,没有显式定义为独立终端规则,词法分析时不会优先识别该运算符
  • ID规则允许变量名中间包含-,词法分析时会优先将x后的-判定为变量名的一部分,导致x->y被拆分为x-、>、y,无法匹配->运算符

修正方案

  1. 显式将->定义为独立终端规则,并且放在ID终端规则的前面,保证其优先级高于ID匹配
  2. 替换语法规则中原先的->字面量为新定义的终端规则名

修正后的完整语法代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:54:07