Parsing XTEXT:用作参数时避免语法匹配

Parsing XTEXT:用作参数时避免语法匹配,parsing,xtext,Parsing,Xtext,我对Xtext还是新手,如果这是一个简单的问题,我深表歉意 我有一个自定义脚本语言,我试图使用XTEXT进行语法检查。该语言每行有一条命令,其格式为: COMMAND:PARAMETERS 当命令的参数也是命令关键字时,我遇到了一个问题。语法文件的相关部分: Model: (commands += AbstractCommand)* ; AbstractCommand: Command1 | Command2 ; Command1: command = 'comma

我对Xtext还是新手,如果这是一个简单的问题,我深表歉意

我有一个自定义脚本语言,我试图使用XTEXT进行语法检查。该语言每行有一条命令,其格式为:

COMMAND:PARAMETERS
当命令的参数也是命令关键字时,我遇到了一个问题。语法文件的相关部分:

Model:
    (commands += AbstractCommand)*
;

AbstractCommand:
    Command1 | Command2
;

Command1:
    command = 'command1' ':' value = Parameter
;

Command2:
    command = 'command2' ':' value = Parameter
;

Parameter:
    value = QualifiedParameter 
;

QualifiedParameter:
    (ID |  ' ' | INT | '.' | '-' )+
;
当其中一个命令使用另一个命令作为其参数时,就会出现问题。该语言的规则不允许在同一行上使用实际的第二个命令。在本例中,纯文本恰好与预先存在的命令具有相同的值。例如,假设Command1和Command2需要一个完整的句子作为其参数。以下是一些示例有效命令:

Command1:This is a sentence           
Command2:This is also a sentence
Command1:This sentence has Command2 in it
所有3个命令都有效,但最后一行将生成错误“missing”:“at”“,因为“Command2”有自己的解析规则


我一直在阅读XTEXT文档,似乎我可以使用第一个标记集谓词来避免在识别第一个标记时读取第二个标记,但我找不到任何这样的示例。

我不确定是否了解您的问题。也许您要查找的是以下内容:

Model: greetings+=Greeting*;
Greeting: "Hello" name=MyID "!";
MyID: "Hello" | ID;
这现在允许解析

Hello You!
Hello Hello!

我试图澄清原始示例。希望它现在更容易理解!我的示例显示了解决方案:
QualifiedParameter:(ID |'''''INT |'.|'-''command1'.'command2')+;
。另一点是:您的语法反映的是每行内容,而不是全部。我只是包含了语法的相关部分,因此这里不包含每行部分(而是在实际的语法文件中)。您的解决方案确实有效,但在实际的语法文件中,有30-40个命令。因此,我必须在QualifiedParameter数据规则下列出每个命令。我希望不需要显式列出每个命令。不,因为关键字进入lexer,您必须在解析器规则中列出它们