如何重写这个语法,使它不再含糊不清

时间:2015-05-13 18:40:22

标签: antlr antlr3 xtext

我目前正在研究语法,这应该允许我定义localand全局数组或变量 本地的一个以下划线开头,这是名称中唯一的区别。没有特殊的关键字来定义它是本地的还是全局的,并且没有关键字来表明声明是数组还是变量。
变量可以是一些普通类型,也可以是对另一个变量(本地或全局)的引用,并且可以使用标准花括号来引用数据,也可以引用现有数组。

问题是如果" name = reference"则Xtext无法分离。是变量或数组 这是我现有的语法:

grammar org.declarations.dec.Dec with org.eclipse.xtext.common.Terminals
import "http://www.eclipse.org/emf/2002/Ecore" as ecore

generate dec "http://www.declarations.org/dec/Dec"

Model:
delarations+=(Declaration)*
;

Declaration:
Variable ";" | Array ";"
;

Variable:
    LocalVar
    | GlobalVar
;

    LocalVar:
        name=LOCALNAME "=" variableContent=VarContent
    ;

    GlobalVar:
        name=GLOBALNAME "=" variableContent=VarContent
    ;

        VarContent:
            stringContent=STRING
            | IntContent=INT
            | localRef=[LocalVar|LOCALNAME]
            | globalRef=[GlobalVar|GLOBALNAME]
        ;

Array:
    LocalArray
    |GlobalArray
;

    LocalArray:
        name=LOCALNAME "=" content=ArrayLiteral
    ;

    GlobalArray:
        name=GLOBALNAME "=" content=ArrayLiteral
    ;

        ArrayLiteral:
            "[" (c1=ArrayContent ("," c2+=ArrayContent)*)? "]"
            | localRef=[LocalArray|LOCALNAME]
            | globalRef=[GlobalArray|GLOBALNAME]
        ;

            ArrayContent:
                varContent=VarContent
                | localRef=[LocalArray|LOCALNAME]
                | globalRef=[GlobalArray|GLOBALNAME]
            ;



terminal LOCALNAME:
    "_" ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
;
terminal GLOBALNAME:
    ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
;

我想识别的代码就是:

_localVar1 = "Test";  
globalVar1 = _localVar1;  

globalArray = ["hello",globalVar1];  
nextArray = globalArray;  
anotherArray = [globalArray, nextArray];  

有谁知道如何克服这个问题?

问候Krzmbrzl

1 个答案:

答案 0 :(得分:1)

由于我的问题只是通过评论回答,我会写一个答案,所以问题不会出现在未答复的部分。我找到了解决方案,感谢Christian Dietrich:

解决方案是让解析器忽略声明是变量还是数组,并忽略声明是本地声明还是全局声明。结果语法如下所示:

Model:
elements += Code*
;

Code:
dec=Declaration ";"
;

Declaration:
    name = ID "=" decCon=DecContent
;

    DecContent:
        singleContent=VarContent (op+=OPERATOR nextCon+=VarContent)*
    ;

        VarContent:
            num = NUMBER
            | string = STRING
            | reference = [Declaration]
            | "+"? arrayContent=ArrayLiteral
        ;

            ArrayLiteral:
                con = "[" (content = VarContent ("," nextContent += VarContent)*)? "]"
            ;

确定声明是变量,数组,本地还是gloabal是验证器的任务 这里的规则是:尽可能少地使用解析器,尽可能使用验证器。

希望当遇到类似问题时,这可以帮助您解决问题。

问候Krzmbrzl