Antlr4 为什么解析以空格分隔的语句很慢?

Antlr4 为什么解析以空格分隔的语句很慢?,antlr4,Antlr4,我有一个简单的ANTLR4语法,如下所示: grammar Foo; block : statement+ ; statement : expression ; expression : literal | op=('+' | '-') expression | expression op=('*' | '/' | '%') expression | expression op=('-' | '+')

我有一个简单的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毫秒,对于更大的表达式则要长得多)。另一方面,当我将其解析为表达式时,它大约在一毫秒内解析。最后,如果修改语法使语句以分号分隔,则将上述输入(在末尾添加分号)解析为一个块大约需要一毫秒


是否有一种方法可以构造此语法,使语句以空格分隔,并确保像上面这样的语句块能够快速解析?

我将您的示例块作为单个语句来读取。如果不是,那么语句边界在哪里?如果使用
EOF
标记“
block:statement+EOF”来“锚定”
block
规则,会发生什么?我已经有一段时间没有用antlr做任何事情了,所以如果我在这里错了,请原谅我,但看起来块只是一个或多个语句,语句只是一个语句表达式,语句表达式只是一个表达式,所以块实际上只是一个或多个表达式。假设表达式是递归定义的,那么是否会以阶乘复杂性操作结束呢?也就是说,表达式的每个子集都将作为一个语句进行计算,直到它找到最大的集合。@500 InternalServerError:正确,它可以直接解析为表达式、包含单个表达式的语句或包含单个表达式的单个语句的块。@BartKiers:这没有什么区别,但是谢谢你的建议。