Antlr4 简单C表达式的大型解析树
我在这里使用C语法:解析表达式Antlr4 简单C表达式的大型解析树,antlr4,Antlr4,我在这里使用C语法:解析表达式inta2=5。ANTLR版本是4.3 这里的“5”匹配一个非常大的规则链:initializer->assignmentExpression->conditionalExpression->logicalOrExpression->logicalAndExpression->。。。大约还有10个->primaryExpression->5个 虽然解析最终是正确的,但这似乎是语法中的一个错误。有人能建议修复或澄清吗 不,这不是错误。树越低意味着操作符的优先级越高 编
inta2=5代码>。ANTLR版本是4.3
这里的“5”匹配一个非常大的规则链:initializer->assignmentExpression->conditionalExpression->logicalOrExpression->logicalAndExpression->
。。。大约还有10个->primaryExpression->5个
虽然解析最终是正确的,但这似乎是语法中的一个错误。有人能建议修复或澄清吗
不,这不是错误。树越低意味着操作符的优先级越高
编辑
规则是这样链接的,这可能是因为Terence根据C11规范编写了语法(在语法注释中这样说)。在官方规范中,规则可能是这样写的。不过,你可以用更简洁的方式重写语法。ANTLR4允许直接递归规则,使规则:
expr
: add
;
add
: mult (('+'|'-') mult)*
;
mult
: unary (('*'|'/') unary)*
;
unary
: '-' atom
| atom
;
atom
: '(' expr ')'
| NUMBER
;
等同于以下单一(ANTLR4)规则:
不,这不是虫子。树越低意味着操作符的优先级越高
编辑
规则是这样链接的,这可能是因为Terence根据C11规范编写了语法(在语法注释中这样说)。在官方规范中,规则可能是这样写的。不过,你可以用更简洁的方式重写语法。ANTLR4允许直接递归规则,使规则:
expr
: add
;
add
: mult (('+'|'-') mult)*
;
mult
: unary (('*'|'/') unary)*
;
unary
: '-' atom
| atom
;
atom
: '(' expr ')'
| NUMBER
;
等同于以下单一(ANTLR4)规则:
不过,语法可能会被设计成不同的形式,从而导致不太深刻的结果
有关示例,请参见。这在一条规则中结合了多个优先级级别。我不确定是否可以为C
创建类似的规则(并且可读),但这可能是可能的
这种规则(包括直接左递归)在Antlr4的早期版本中不可用,因此C
语法可能是在这种规则不可用的时候创建的。尽管语法可能设计不同,但结果不太深刻
有关示例,请参见。这在一条规则中结合了多个优先级级别。我不确定是否可以为C
创建类似的规则(并且可读),但这可能是可能的
这种规则(包括直接左递归)在Antlr4的早期版本中不可用,因此C
语法可能是在这种规则不可用的时候创建的。我还有另一个疑问:语法解释int a1代码>作为声明说明符,即标记int
和a1
被解释为声明说明符
。我希望a1
被解释为initDeclaratorList
的一部分。我通过将声明
规则更改为使用initDeclarationList
而不是initDeclarationList?
解决了这个问题。这样行吗?还是这会破坏其他东西?@AnujKalia,嗯,不知道。您可以在存储库的跟踪器上提出一个问题:我还有一个疑问:语法解释inta1代码>作为声明说明符,即标记int
和a1
被解释为声明说明符
。我希望a1
被解释为initDeclaratorList
的一部分。我通过将声明
规则更改为使用initDeclarationList
而不是initDeclarationList?
解决了这个问题。这样行吗?还是这会破坏其他东西?@AnujKalia,嗯,不知道。你可以在存储库的跟踪器上提出一个问题:如果你把所有不同的操作放在一个规则中,你就不能控制操作符的优先级(更不用说语法的可读性了)。@MikeLischke:但它似乎在提到的Java语法中起作用(我也为自己的语法修改了它)。正如我所提到的,可读性可能会受到影响。@MikeLischke,是的,你可以:以下是一个有效的ANTLR4规则,*
和/
的优先级高于+
和-
,因为它们是先定义的:e:e('*''.'/')e | e('+'''''''.-')e | INT代码>@MikeLischke由于所有内容都保存在一个地方,因此它可能更具可读性。至少Java表达式规则对我来说是可读的。但正如我所说,对于C规则来说,这可能并不成立。但我确信,至少有些规则可以组合在一起而不影响可读性,甚至可以增强可读性。如果将所有不同的操作放在一个规则中,则无法控制运算符优先级(更不用说语法的可读性了)。@MikeLischke:但它似乎在所提到的Java语法中起作用(我也为自己的语法修改了它。)可读性可能会像我提到的那样受到影响。@MikeLischke,是的,你可以:下面是一个有效的ANTLR4规则,其中*
和/
的优先级高于+
和-
,因为它们是先定义的:e:e('*'''''''.'/'))e('+'''''.'-'))e | INT;
@MikeLischke由于所有内容都保存在一个地方,因此它可能更具可读性。至少Java表达式规则对我来说似乎是可读的。但正如我所说,这可能对C规则不适用。但我确信,至少有些规则可以在不影响可读性的情况下进行组合,甚至可以增强可读性。