类似问题:Using PyParsing to parse language with signficant newlines (like Python)
我喜欢pyparsing的特性,它通常忽略空白,但是我的语法中有一些表达式,它们必须写在同一行上
问题是:如何限制特定表达式的换行?
我在文档中看到了setWhitespaceChars
方法,它应该正好做到这一点,但它似乎不起作用(参见下面的示例)
我需要解析以下表达式:
{
ref: 4121!
}
这里大括号可以用新行格式化,但是ref
部分必须是一行
我定义语法:
>>> import pyparsing as pp
>>> ref = pp.CaselessLiteral('ref:') + pp.Word(pp.nums) + '!'
>>> braces = '{' + ref + '}'
现在我尝试更改ref
的空格:
>>> ref.setWhitespaceChars({' ', '\t'})
{{'ref:' W:(0123...)} "!"}
>>> ref.whiteChars
{'\t', ' '}
但是,当我尝试解析test_字符串(格式错误)时,它会毫无错误地解析它:
>>> test_string = 'ref:\n123\n!'
>>> ref.parseString(test_string)
(['ref:', '123', '!'], {})
我做错了什么
似乎我需要对每个元素应用setWhitespaceChars
,这些元素必须保持在同一行:
>>> import pyparsing as pp
>>> ref = pp.CaselessLiteral('ref:') + pp.Word(pp.nums).setWhitespaceChars(' \t\r') + pp.Literal('!').setWhitespaceChars(' \t\r')
>>> s = 'ref:\n123\n!'
>>> ref.parseString(s)
Traceback (most recent call last):
...
pyparsing.ParseException: Expected W:(0123...), found '\n' (at char 4), (line:1, col:5)
这增加了太多的混乱,我可能最好在开始时调用setDefaultWhitespaceChars
,然后在每个表达式周围添加换行符元素,我几乎认为我不需要进行pyparsing。还有其他解决办法吗
目前没有回答
相关问题 更多 >
编程相关推荐