gpt4 book ai didi

parsing - ANTLR 4 解析器语法

转载 作者:行者123 更新时间:2023-12-02 17:18:38 27 4
gpt4 key购买 nike

如何改进我的解析器语法,而不是为我的测试代码创建包含几个 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
;

最佳答案

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

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

Is there any thing can I do with the grammar to make both f and sum roots – Jonny Magnam

不直接在 Antlr v4 语法中。你可以:

  1. 切换到 Antlr v3 或其他解析器工具,并根据需要定义生成的 AST。
  2. 遍历 Antlr v4 解析树并创建所需形式的单独 AST。
  3. 只需直接使用解析树,并认识到它在信息上等同于经典定义的 AST,并且实现提供了许多实际好处。

具体来说,标准学术 AST 是可变的,这意味着每个(或除第一个之外的所有)访问者都是自定义的,而不是生成的,并且底层语法或 AST 临时结构的任何更改都需要重新考虑和可能的更改给每个后续访问者及其实现的逻辑。

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

为整个工作选择正确的工具,无论您以何种方式定义它。

关于parsing - ANTLR 4 解析器语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30312976/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com