如何在Xtext中实现可引用<ID INT>格式标签的goto表达式?
实现思路及代码示例
1. 调整词法规则,定义标签专属终端符
首先在你的.xtext语法文件的终端规则部分,把<bb 数字>这种固定格式的标签定义为独立终端,避免中间的空格被默认的空白规则过滤,注意该规则要放在ID规则之前,避免被ID规则优先匹配:
terminal BB_LABEL: '<' 'bb' ' ' INT '>';
2. 修改Label相关语法规则
把原来Label的name属性从ID替换为你刚定义的BB_LABEL终端:
Label returns Label: {Label} name= BB_LABEL ;
3. 调整Goto的交叉引用规则
Xtext默认的交叉引用语法[Label]等价于[Label|ID],仅接受ID格式的引用值,你需要把引用的语法片段显式指定为BB_LABEL,让解析器能识别<bb 数字>格式的引用:
Goto returns Goto: {Goto} 'goto' goto+=[Label|BB_LABEL] ';' ;
4. 可选扩展:支持自定义前缀的标签
如果你后续需要支持除了bb之外的其他前缀标签,可以不用写死终端规则,改成通用的尖括号内容规则:
// 定义尖括号包裹的内容终端 terminal ANGLE_CONTENT: '<' -> '>'; Label returns Label: {Label} name= ANGLE_CONTENT ; // 引用部分同步修改 Goto returns Goto: {Goto} 'goto' goto+=[Label|ANGLE_CONTENT] ';' ;
验证效果
修改完成后重新生成Xtext的基础设施,以下语法就能被正确解析:
// 标签定义 <bb 2>: // goto跳转 goto <bb 2>;
内容的提问来源于stack exchange,提问作者Soulimane Kamni
相关产品推荐
相关产品推荐

