0

几天前我开始玩 xtext 并且刚刚浏览了教程。也许解决方案已在某处的参考资料中有所提及,但我无法很快得到它。

我的问题是这个。我试着写一个简单的语法,混合在org.eclipse.xtext.common.Terminals. 然后我想像这样插入一个 cusotm 终端FILE_NAME

terminal FILE_NAME:
( !('/' | '\\' | ':' | '*' | '?' | '"' | '<' | '>' | '|') )+
;

这基本上就是在 Windows 下允许的文件名。但是,通过这样做,继承的规则(如 ID、INT 等)将永远不会匹配,因为它们总是在自定义终端之后生成。

可以优雅地避免这种问题吗(尽可能不重复和尽可能普遍)?提前致谢!

4

1 回答 1

0

终端规则(又名词法分析器规则)用于标记输入序列。恕我直言,终端规则中应该有最少的语义。

您尝试表达一个只接受有效文件名的专用解析器规则。

查看 Xtext 文档 [1] 中描述的解析器阶段。我的建议:

  1. Lexing:不要使用专门的终端规则,而是使用 STRING。

  2. 验证:为具有“fileName”EAttribute 的 EClass 编写验证规则。



尽可能不重复和尽可能笼统

您不希望使用“fileName”EAttribute 对每个 EClass 重复验证。如果您有精炼的 Ecore 模型,请引入具有“文件名”EAttribute 的新超类型。

你可以实现一个通用的验证规则#check_fileName_is_valid(ElementWithFile)。

如果您没有精炼的 MM ,请在语法中使用元模型提示。如果你提供一个通用的超类型,Xtext 的 Ecore 推断器将提取子类型的共同特征。前任:

ElementWithFile: A | B;
A: ... 'file' fileName=STRING ...;
B: ... 'file' fileName=STRING ...;
// => Ecore: ElementWithFile.fileName<EString>



[1] http://www.eclipse.org/Xtext/documentation.html#DSL

于 2012-12-05T09:36:59.930 回答