【问题标题】:How can I create a ply rule for recognizing CRs?如何创建用于识别 CR 的层规则?
【发布时间】:2012-10-22 12:17:13
【问题描述】:

我在 PLY 词法分析器中无法区分 \r (0x0d) 和 \n (0x0a)。

一个最小的例子是下面的程序

import ply.lex as lex

# token names
tokens = ('CR', 'LF')

# token regexes
t_CR = r'\r'
t_LF = r'\n'

# chars to ignore
t_ignore  = 'abc \t'

# Build the lexer
lexer = lex.lex()

# lex
f = open('foo', 'r')
lexer.input(f.read())
while True:
    tok = lexer.token()
    if not tok: break
    print(tok)

现在创建一个文件 foo 如下:

printf "a\r\n\r\rbc\r\n\n\r" > foo

验证它看起来没问题:

hd foo
00000000  61 0d 0a 0d 0d 62 63 0d  0a 0a 0d                 |a....bc....|
0000000b

现在我假设我会得到一些 CR 和一些 LF 令牌,但是:

python3 crlf.py 
WARNING: No t_error rule is defined
LexToken(LF,'\n',1,1)
LexToken(LF,'\n',1,2)
LexToken(LF,'\n',1,3)
LexToken(LF,'\n',1,6)
LexToken(LF,'\n',1,7)
LexToken(LF,'\n',1,8)

原来我只得到 LF 令牌。我想知道为什么会发生这种情况,以及我应该怎么做。

这是 Ubuntu 12.04 上的 Python 3.2.3

【问题讨论】:

    标签: python lexer ply


    【解决方案1】:

    您以默认模式打开文件。在该模式下,newline=None,意味着(除其他外)任何 \r\n\r\n 都被视为行尾并转换为单个 \n 字符.详情请见open documentation

    您可以通过将newline='' 传递给open 来禁用此行为,这意味着它将接受任何类型的换行符,但不会将它们标准化为\n

    【讨论】:

    • 谢谢! (回想起来,我不知道为什么我从来没有想过这种行为可能与 PLY 以外的其他事物有关)。
    猜你喜欢
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多