Antlr4 为什么解析以空格分隔的语句很慢?
我有一个简单的ANTLR4语法,如下所示:Antlr4 为什么解析以空格分隔的语句很慢?,antlr4,Antlr4,我有一个简单的ANTLR4语法,如下所示: grammar Foo; block : statement+ ; statement : expression ; expression : literal | op=('+' | '-') expression | expression op=('*' | '/' | '%') expression | expression op=('-' | '+')
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:这没有什么区别,但是谢谢你的建议。