我正在创建一个支持重要空格的语法(最像“Z”lisp 变体而不是 Python 或 yaml,但同样的想法)
我看到了这篇关于如何在 pegasus 中进行重要空白解析的文章,一个用于 C# 的 PEG 解析器
但是我在将其转换为欧芹方面不太成功,看起来 Pegasus 中的 #STATE# 变量以某种方式跟随回溯。
这是我得到的最接近简单解析器的方法,如果我使用indentwith look forward的版本,它无法解析子代,如果我使用不带它的版本,它无法解析兄弟。
如果这是欧芹的限制并且我需要使用 PyPEG 或 Parsimonious 或其他东西,我对此持开放态度,但似乎如果内部缩进变量可以遵循 PEG 内部回溯,这一切都会起作用。
import parsley
def indent(s):
s['i'] += 2
print('indent i=%d' % s['i'])
def deindent(s):
s['i'] -= 2
print('deindent i=%d' % s['i'])
grammar = parsley.makeGrammar(r'''
id = <letterOrDigit+>
eol = '\n' | end
nots = anything:x ?(x != ' ')
node = I:i id:name eol !(fn_print(_state['i'], name)) -> i, name
#I = …Run Code Online (Sandbox Code Playgroud)