pyparsing和换行符

Hyp*_*eus 8 python newline pyparsing

我刚刚开始,pyparsing我遇到了换行问题.

我的语法是:

from pyparsing import *

newline = LineEnd () #Literal ('\n').leaveWhitespace ()
minus = Literal ('-')
plus = Literal ('+')
lparen = Literal ('(')
rparen = Literal (')')
ident = Word (alphas)
integer = Word (nums)

arith = Forward ()
parenthized = Group (lparen + arith + rparen)
atom = ident | integer | parenthized

factor = ZeroOrMore (minus | plus) + atom
arith << (ZeroOrMore (factor + (minus | plus) ) + factor)

statement = arith + newline
program = OneOrMore (statement)
Run Code Online (Sandbox Code Playgroud)

现在,当我解析以下内容时:

print (program.parseString ('--1-(-a-3+n)\nx\n') )
Run Code Online (Sandbox Code Playgroud)

结果如预期:

['-', '-', '1', '-', ['(', '-', 'a', '-', '3', '+', 'n', ')'], '\n', 'x', '\n']
Run Code Online (Sandbox Code Playgroud)

但是当第二行可以被解析为第一行的尾部时,第一行\n是否已经被淘汰了?

码:

print (program.parseString ('--1-(-a-3+n)\n-x\n') )
Run Code Online (Sandbox Code Playgroud)

实际结果:

['-', '-', '1', '-', ['(', '-', 'a', '-', '3', '+', 'n', ')'], '-', 'x', '\n']
Run Code Online (Sandbox Code Playgroud)

预期结果:

['-', '-', '1', '-', ['(', '-', 'a', '-', '3', '+', 'n', ')'], '\n', '-', 'x', '\n']
Run Code Online (Sandbox Code Playgroud)

实际上我不希望解析器自动加入语句.

1.我做错了什么?

2.我该如何解决这个问题?

3.引擎盖下发生了什么导致这种行为(这肯定是明智的,但我只是没有看到这一点)?

Pau*_*McG 11

'\n'通常作为空格字符跳过.如果你想要'\n'是重要的,那么你必须调用setDefaultWhitespaceChars删除'\n'作为可跳过的空格(你必须在定义任何pyparsing表达式之前执行此操作):

from pyparsing import *
ParserElement.setDefaultWhitespaceChars(' \t')
Run Code Online (Sandbox Code Playgroud)


小智 5

这里发生的事情是解析器默认忽略任何空格。在定义任何元素之前,您需要添加以下代码行:

ParserElement.setDefaultWhitespaceChars(" \t")
Run Code Online (Sandbox Code Playgroud)

我相信,正常的默认空白字符是“\t\r\n”。

编辑:保罗打败了我。一起吃完晚饭我应该精神焕发。:)