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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:53:24