我尝试使用pyPEG2将MoinMoin标记翻译为Markdown,在某些情况下我需要注意新行。但是,我甚至无法使我的换行解析测试工作。我是pyPEG的新手,我的Python生疏了。请耐心等待。
以下是代码:
#!/usr/local/bin/python3
from pypeg2 import *
import re
class Newline(List):
grammar = re.compile(r'\n')
parse("\n", Newline)
parse("""
""", Newline)
这导致:
Traceback (most recent call last):
File "./pyPegNewlineTest.py", line 7, in <module>
parse("\n", Newline)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pypeg2/__init__.py", line 667, in parse
t, r = parser.parse(text, thing)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pypeg2/__init__.py", line 794, in parse
raise r
File "<string>", line 2
^
SyntaxError: expecting match on \n
就像pypeg在\ n。
之后插入一个空行一样尝试其他选项,例如
grammar = re.compile(r'\n', re.MULTILINE)
grammar = re.compile(r'\r\n|\r|\n', re.MULTILINE)
grammar = contiguous(re.compile(r'\r\n|\r|\n', re.MULTILINE))
以及那些不会改变错误信息的各种组合(虽然我不认为我尝试了所有组合)。将Newline
更改为子类str
而不是List
也不会更改错误。
更新
我已经发现pypeg在解析它之前正在剥离换行符:
#!/usr/local/bin/python3
from pypeg2 import *
import re
class Newline(str):
grammar = contiguous(re.compile(r'a'))
parse("\na", Newline)
parse("""
a""", Newline)
print("Success, of a sort.")
运行此结果:
Success, of a sort.
如果我覆盖Newline
parse
方法,我甚至不会看到换行符。它得到的第一件事是&#34; a&#34;。这与我在其他地方看到的情况一致。即使指定了contiguous
,pypeg也会删除所有前导空格。
那么,那是怎么回事。不知道该怎么办。
答案 0 :(得分:1)
是的,默认情况下pypeg删除包含换行符的空格。
通过在whitespace
函数中设置可选的parse()
参数,例如,可以很容易地进行配置。在:
parse("\na", Newline, whitespace=re.compile(r"[ \t\r]"))
这样做仍将跳过空格和制表符,但不会跳过换行符\n
。
通过此示例,解析器现在可以正确找到语法错误:
SyntaxError: expecting match on a