java - 如何在 Xtext 语法中允许一行 Java 代码

标签 java dsl xtext

问题:我希望在我的语法中有一个执行 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/

相关文章:

JavaFX Maven jfx :jar error: Could not find artifact javafx-packager

java - 我需要一个框架才能使用依赖注入(inject)吗?

java - 如何通过Java中的ssh隧道连接到MySQL数据库?

Elasticsearch |匹配多个短语

c# - 用户可写配置文件的示例?

java - 在 Xtend 循环中使用唯一的变量名称(代码生成)

java - 如何在Spring Security 4中动态修改登录用户的角色?

haskell - 我什么时候想使用 Free Monad + Interpreter 模式?

java - 如何将 Xtext 生成器包含在我的 Maven 项目中?

java - 如何修复执行 EValidator 时发生的错误