如何在Xtext中允许带引号的空格?附MyDSL语法示例
在Xtext中实现允许带引号的空格方案
针对你基于org.eclipse.xtext.common.Terminals搭建的MyDSL语法,要实现带引号的空格支持,核心是自定义能容纳空格的字符串终端规则,下面一步步给你说明修改方式:
1. 自定义支持带空格的字符串终端
在你的MyDsl.xtext语法文件中,添加一个自定义的终端规则MYSTRING,专门用来匹配带双引号、允许内部包含空格(甚至转义双引号)的字符串:
terminal MYSTRING: '"' ( '\\"' | . )*? '"' ;
这个规则的逻辑很直白:
- 以双引号开头和结尾
- 内部可以是转义的双引号(
\\")或者任意其他字符(包括空格) - 用
*?非贪婪匹配,避免把多个相邻的字符串误识别成一个
2. 调整现有语法规则引用
你原来的LABEL规则已经在使用MYSTRING,只需要确保这个自定义终端规则放在LABEL规则之前就可以了。下面是完整的修改后语法示例,我把DIRECTIVES补充了基础内容方便测试:
Creates myDSL grammar from Terminals grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals generate myDsl "http://www.xtext.org/example/mydsl/MyDsl" // 自定义支持带引号和空格的字符串终端 terminal MYSTRING: '"' ( '\\"' | . )*? '"' ; Model: lines+=LINE*; LINE: LABEL? outTest=DIRECTIVES; LABEL: inputs+=MYSTRING (',' inputs+=MYSTRING )*; // 示例指令规则,可根据你的实际需求扩展 DIRECTIVES: 'WITHOUT_SPACE' | 'WITH_SPACE';
3. 测试验证
现在你可以编写测试用例来验证效果,比如:
"user name", "email address" WITHOUT_SPACE "product description" WITH_SPACE WITHOUT_SPACE
这段代码里,"user name"和"email address"都是带空格的带引号字符串,Xtext会正确识别它们作为LABEL的输入项,不会因为空格把它们拆分成多个元素。
注意事项
- 如果你原来的语法中用到了默认的
STRING终端,要注意自定义的MYSTRING和它的优先级,建议把MYSTRING放在语法文件的靠前位置,保证Xtext优先匹配它。 - 如果需要支持单引号的带空格字符串,可以复制类似的规则,把双引号换成单引号即可。
内容的提问来源于stack exchange,提问作者Ningareddy Modase
相关产品推荐
相关产品推荐

