集团终端成套

时间:2013-04-26 09:14:42

标签: grammar set antlr4

Group terminals into sets

这个警告意味着什么? 我该如何解决?

以下是我所指的代码

expression : expression operator=DIV expression
           | expression operator=MUL expression
           | expression operator=ADD expression
           | expression operator=SUB expression
           | INT
           | FLOAT
           | BOOLEAN
           | NULL
           | ID
           ;

1 个答案:

答案 0 :(得分:12)

在某些情况下,ANTLR 4解析器生成器可以组合转换组以形成单个“设置转换”,从而减少静态和动态内存开销,并提高运行时性能。只有当块的所有替代项都包含单个元素或集合时,才会发生这种情况。例如,以下代码允许将INTFLOAT合并为一个转换:

// example 1
number
    :   INT
    |   FLOAT
    ;

// example 2, elements grouped into a set
primary
    :   '(' expression ')'
    |   (INT | FLOAT)
    ;

但是,在以下情况下,编译器无法组合元素,因此它们将被单独处理:

primary
    :   '(' expression ')'
    |   INT
    |   FLOAT
    ;

提示建议简单添加( ... )的位置足以让编译器折叠一个原本无法实现的集合。将代码更改为以下内容将解决警告。

expression
    :   expression operator=DIV expression
    |   expression operator=MUL expression
    |   expression operator=ADD expression
    |   expression operator=SUB expression
    |   (   INT
        |   FLOAT
        |   BOOLEAN
        |   NULL
        |   ID
        )
    ;