Parsing ANTLR 4语法分析器
如何改进解析器语法,从而不必为测试代码创建包含两条Parsing ANTLR 4语法分析器,parsing,compiler-construction,antlr,antlr4,Parsing,Compiler Construction,Antlr,Antlr4,如何改进解析器语法,从而不必为测试代码创建包含两条decFunc规则的AST。它将只创建一个,并且sum将成为第二个根。我试图用多种不同的方法来解决这个问题,但我总是得到一个左递归错误。 这是我的测试代码: f :: [Int] -> [Int] -> [Int] f x y = zipWith (sum) x y sum :: [Int] -> [Int] sum a = foldr(+) a 这是我的语法: 这是此链接中有两个decFunc的图像 测试输入包含两个与de
decFunc
规则的AST。它将只创建一个,并且sum
将成为第二个根。我试图用多种不同的方法来解决这个问题,但我总是得到一个左递归错误。
这是我的测试代码:
f :: [Int] -> [Int] -> [Int]
f x y = zipWith (sum) x y
sum :: [Int] -> [Int]
sum a = foldr(+) a
这是我的语法:
这是此链接中有两个decFunc
的图像
测试输入包含两个与
decFunc
规则匹配的内容实例。生成的解析树精确地显示:两个子树,每个子树的根为deFunc
Antlr v4不会产生真正的AST,其中f
和sum
是独立子树的根
我能用语法做些什么来同时做f
和sum
根吗
不是直接在Antlr v4语法中。你可以:
为整个作业选择合适的工具,无论您以何种方式定义它。所需的输出是什么?说“创建一个而不是两个
decFunc
”没有多大意义。尝试创建一个类似于您想要的AST。@Mephy我改进了我的问题。我基本上是想让sum引用另一个stat,它可以是一个声明或实现。然而,sum仅仅是声明或实现的第一个词,我如何才能做到这一点?这就是我所要求的。有人建议向前看。但我不知道怎么做,直到不清楚你在问什么。测试输入包含两个与decFunc
规则匹配的内容实例。生成的解析树正好显示:两个子树,每个子树都有一个deFunc
实例作为根。Antlr v4不会生成真正的AST,其中f
和sum
是独立子树的根,如果这是您正在寻找的,则。@GRosenberg感谢您的回答。我能用语法做些什么来做f和和和的根吗?谢谢你宝贵的时间和你的回答。它帮助我认识到,如果我要继续使用ANTLR4,我应该接受AST的现状。我想问你,在实现翻译人员、听众或访问者时,你更喜欢哪一种。翻译将生成另一个不需要计算的代码。访问者和侦听器之间唯一实际的区别是访问者传递一个返回对象,而侦听器不传递任何内容。在某些情况下,返回对象可能很有用。真正取决于你决定它是否有助于你的具体设计。
prog : stat+;
stat : decFunc | impFunc ;
decFunc : ID '::' formalType ( ARROW formalType )* NL impFunc
;
anotherFunc : ID+;
formalType : 'Int' | '[' formalType ']' ;
impFunc : ID+ '=' hr NL
;
hr : 'map' '(' ID* ')' ID*
| 'zipWith' '(' ('*' |'/' |'+' |'-') ')' ID+ | 'zipWith' '(' anotherFunc ')' ID+
| 'foldr' '(' ('*' |'/' |'+' |'-') ')' ID+
| hr op=('*'| '/' | '.&.' | 'xor' ) hr | DIGIT
| 'shiftL' hr hr | 'shiftR' hr hr
| hr op=('+'| '-') hr | DIGIT
| '(' hr ')'
| ID '(' ID* ')'
| ID
;