parsing - "expression"的非左递归 PEG 语法

标签 parsing compiler-construction programming-languages lexer

它要么是一个简单的标识符(如cow),被方括号包围((...)),看起来像一个方法调用(.. .(...)) 或类似成员访问权限的内容 (thing.member):

def expr = identifier | 
           "(" ~> expr <~ ")" | 
           expr ~ ("(" ~> expr <~ ")") | 
           expr ~ "." ~ identifier

它以 Scala Parser Combinator 语法给出,但应该非常容易理解。它类似于表达式最终在许多编程语言中的查找方式(因此得名 expr),但是,就目前情况而言,它是左递归的,会导致我漂亮的 PEG 解析器崩溃。

我没有成功地分解出左递归,同时仍然保持像 (cow.head).moo(dog.run(fast)) 这样的情况的正确性。我该如何重构它,或者我是否需要转向一些可以容忍左递归语法的解析器生成器?

最佳答案

诀窍是拥有多个规则,其中每个规则的第一个元素是下一个规则,而不是对同一规则的递归调用,并且规则的其余部分是可选的且重复的。例如,以下内容适用于您的示例:

def expr              = method_call
def method_call       = member_access ~ ( "(" ~> expr <~ ")" ).*
def member_access     = atomic_expression ~ ( "." ~> identifier).*
def atomic_expression = identifier |
                        "(" ~> expr  <~ ")"

关于parsing - "expression"的非左递归 PEG 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13374121/

相关文章:

c++ - Boost Spirit 调试输出不出现

rust - Rust借阅检查器是否在本地或全局分析程序?

compiler-construction - 编译器测试用例或如何测试编译器

architecture - 为什么大多数编程语言都建立在框架之上?

programming-languages - 是否有将功能代码转换为命令代码的标准化方法?

json - Node 服务器在解析 JSON 时崩溃

python - 使用 python 查找 HTML 标签

xml - 具有相同元素标签但数据唯一的XML解析

c++ - 链接错误与编译错误

visual-c++ - 基本代码布局问题