【问题标题】:XTEXT: Avoiding grammar match when used as a parameterXTEXT:用作参数时避免语法匹配
【发布时间】:2019-05-07 14:20:32
【问题描述】:

我还是 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”:,因为“Command2”有自己的解析规则。

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

【问题讨论】:

    标签: parsing xtext


    【解决方案1】:

    我不确定我是否得到你的问题。也许您正在寻找的是以下内容:

    Model: greetings+=Greeting*;
    Greeting: "Hello" name=MyID "!";
    MyID: "Hello" | ID;
    

    现在允许解析

    Hello You!
    Hello Hello!
    

    【讨论】:

    • 我试图澄清原始示例。希望现在更容易理解!
    • 我的示例显示了解决方案:QualifiedParameter: (ID | ' ' | INT | '.' | '-' | 'command1' | 'command2')+ ;。另一点是:您的语法根本没有反映 per line 的东西
    • 我刚刚包含了语法的相关部分,所以这里没有包含 per line 部分(但在实际的语法文件中)。您的解决方案确实有效,但在实际的语法文件中,有 30-40 个命令。所以我必须在 QualifiedParameter 数据规则下列出每一个命令。我希望有一些我不需要明确列出每个命令的东西。
    • 没有,因为关键字进入词法分析器,您必须在解析器规则中列出它们
    猜你喜欢
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2011-06-12
    • 2015-08-01
    • 1970-01-01
    • 2017-07-12
    相关资源
    最近更新 更多