【发布时间】:2011-05-11 11:09:22
【问题描述】:
您将如何在以下任何可以处理 Python/Haskell/CoffeScript 样式缩进的解析器生成器(PEG.js、Citrus、Treetop)中编写 Parsing Expression Grammar:
尚不存在的编程语言示例:
square x =
x * x
cube x =
x * square x
fib n =
if n <= 1
0
else
fib(n - 2) + fib(n - 1) # some cheating allowed here with brackets
更新: 不要尝试为上面的示例编写解释器。我只对缩进问题感兴趣。另一个例子可能是解析以下内容:
foo
bar = 1
baz = 2
tap
zap = 3
# should yield (ruby style hashmap):
# {:foo => { :bar => 1, :baz => 2}, :tap => { :zap => 3 } }
【问题讨论】:
-
我对 Citrus 和 Treetop 不熟悉,但是虽然 PEG.js 是一个简洁的小工具,但它对于这种解释来说太短了,IMO。另外,我不认为有人会发布一个(相当)简单的语法文件(嵌入了动作),能够解释您描述的这种语言,因为除了定义语法之外还涉及很多代码:遍历 AST,将数据保存在不同的作用域,解析作用域中的变量,如果在其中找不到某个变量,甚至可能弹出作用域。
-
P.S.你问问题的方式就好像你自己有答案一样。这是一个真正的问题,还是更多的谜题?如果这是一个真正的问题,我建议您尝试Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages:它还解释了如何解释像 Python 这样的语言(至少是“缩进敏感”部分)。
-
嗨,巴特,感谢您提供图书链接。不幸的是,我没有答案。我知道为上面示例中给出的语言创建解释器并非易事,但这不是我所期望的。我只对如何处理缩进部分/解析问题的部分感兴趣。事实上,我能够编写一个手写的解析器来跟踪缩进级别,但是我不知何故无法将这个概念映射到 PEG。任何帮助表示赞赏。马特
标签: parsing syntax language-design treetop peg