问题:我希望在我的语法中有一个执行 block ,它允许任何有效的 java 行(或只是任何行,这也可以)在其边界内:
Execution:
{Execution} 'execute {'
(lines+=(JavaLine | Referral))*
'}'
;
Referral:
inReferal | outReferal
;
inReferal:
name=ID '<=' port=ID
;
outReferal:
name=ID '=>' port=ID
;
JavaLine:
{JavaLine}(words+=ID)* ';' // this doesn't fit quite its needs, no . - { etc allowed
;
这是语法的相关部分,我如何构建 JavaLine 才能获得任何行?
额外问题:我有其他规则,例如 OutPort 或参数,如何防止它们在我的执行 block 中使用? (我在 java 行中突出显示了语法关键字)
Model:
stages+=Stage*;
Stage:
'stage' name=ID (('implements' interfaces=List)? & ('extends' extension=ID)?) '{'
lines+=StageItems*
'}';
List: items+=ID (',' items+=ID)*;
StageItems:
InPort | OutPort | Parameter | Execution
;
Parameter:
'param' type=ID name=ID
;
InPort:
'in' type=ID name=ID
;
OutPort:
'out' type=ID name=ID
;
最佳答案
Java 代码不按行组织。从技术上讲,几乎任何行都可以作为 Java 源代码,因为您可以在 Java 源代码中放置 /* */
多行注释。
如果您排除行概念,您可以使用Java Grammar (Java7)解析Java源代码或Java Grammar (Java8) - 这是一项相当大的工作。
如果您只实现 Block 语法 ( see here ),这可能会更容易 - 它表示 Java 中的可执行 block 。这样工作量就少了。
如果您只想允许单行 Java 代码(保留 line 概念),您可以专注于 语句 级别,选择允许的语句类型(例如没有子类定义,没有标签等)
关于java - 如何在 Xtext 语法中允许一行 Java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32674061/