为什么解析以空格分隔的语句会变慢?

时间:2016-03-25 14:31:34

标签: antlr4

我有一个简单的ANTLR4语法如下:

grammar Foo;

block
    :   statement+
    ;

statement
    :   expression
    ;

expression
    :   literal
    |   op=('+' | '-') expression
    |   expression op=('*' | '/' | '%') expression
    |   expression op=('-' | '+') expression
    ;

literal
    :   NUM
    ;

NUM
    :   INT+
    |   INT* '.' INT+
    ;

fragment
INT
    :   ('0'..'9')+
    ;

WS
    :   (' ' | '\t' | '\r' | '\n' ) -> skip
    ;

当我使用这个语法解析时,例如" -1 + -84 - -2 * -1 / -2 * -1 - 1 + 1 / -1"作为使用为JavaScript生成的解析器的块,它非常慢(大约为500毫秒,对于更大的表达式则更长)。另一方面,当我将其解析为表达式时,它会在大约一毫秒内解析。最后,如果我修改语法以便语句由分号分隔,解析上面的输入(用分号添加到结尾)作为一个块大约需要一毫秒。

有没有办法可以构造这个语法,以便语句以空格分隔,并确保上述语句块能够快速解析?

0 个答案:

没有答案