ANTLR 4 Parser Grammar

时间:2015-05-18 21:19:40

标签: 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的图像 http://postimg.org/image/w5goph9b7/

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
                ;

1 个答案:

答案 0 :(得分:3)

您的测试输入包含两个与decFunc规则匹配的内容实例。生成的解析树完全显示:两个子树,每个子树都有deFunc作为根。

Antlr v4不会生成真正的AST,其中fsum是不同子树的根。

  

我是否可以用语法来制作fsum根 - Jonny Magnam

不直接使用Antlr v4语法。你可以:

  1. 切换到Antlr v3或其他解析器工具,并根据需要定义生成的AST。
  2. 走Antlr v4解析树并创建所需表单的单独AST。
  3. 直接使用解析树,并认识到它在信息上等同于经典定义的AST,并且实现提供了许多实际的好处。
  4. 具体而言,标准学术AST是可变的,这意味着每个(或所有除了第一个)访问者都是自定义的,而不是生成的,并且基础语法或AST的临时结构的任何变化都需要重新考虑并且可能会发生变化每个后来的访问者及其实施的逻辑。

    Antlr v4解析树本质上是不可变的,允许在不损失关系完整性的情况下针对树节点累积装饰。参观者都使用共同的基础结构,大大减少了由于语法变化和先前执行访问者的影响而导致的脆弱性。实际上,除非明确需要,否则树木漫步很容易构建,快速且相互独立。他们可以在设计中实现更大的关注点分离,并在实践中更轻松地维护代码。

    以您定义的任何方式为整个作业选择合适的工具。