Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Antlr4 简单C表达式的大型解析树_Antlr4 - Fatal编程技术网

Antlr4 简单C表达式的大型解析树

Antlr4 简单C表达式的大型解析树,antlr4,Antlr4,我在这里使用C语法:解析表达式inta2=5。ANTLR版本是4.3 这里的“5”匹配一个非常大的规则链:initializer->assignmentExpression->conditionalExpression->logicalOrExpression->logicalAndExpression->。。。大约还有10个->primaryExpression->5个 虽然解析最终是正确的,但这似乎是语法中的一个错误。有人能建议修复或澄清吗 不,这不是错误。树越低意味着操作符的优先级越高 编

我在这里使用C语法:解析表达式
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规则不适用。但我确信,至少有些规则可以在不影响可读性的情况下进行组合,甚至可以增强可读性。