我使用ply決議資料。我嘗試使用空格作為詞位的一部分。這里有一個簡化的例子:
from ply.lex import lex
from ply.yacc import yacc
tokens = ('NUM', 'SPACE')
t_NUM = r'\d '
t_SPACE = r' '
def t_error(t):
print(f'Illegal character {t.value[0]!r}')
t.lexer.skip(1)
lexer = lex()
def p_two(p):
'''
two : NUM SPACE NUM
'''
p[0] = ('two', p[1], p[2], p[3])
def p_error(p):
if p:
print(f"Syntax error at '{p.value}'")
else:
print("Syntax error at EOF")
parser = yacc()
ast = parser.parse('1 2')
print(ast)
當我運行時,我得到了錯誤:
ERROR: Regular expression for rule 't_SPACE' matches empty string
Traceback (most recent call last):
File "c:\demo\simple_space.py", line 19, in <module>
lexer = lex()
File "C:\demo\3rdparty\ply\ply\lex.py", line 752, in lex
raise SyntaxError("Can't build lexer")
SyntaxError: Can't build lexer
是否可以將空間指定為詞位的一部分?一些額外的可能標記:
t_COMMENT = r' \#.*'征求意見t_DIVIDE = r': '對于分隔線
uj5u.com熱心網友回復:
這在代幣規范的 Ply 手冊部分中進行了解釋:
在內部,lex.py 使用 re 模塊進行模式匹配。模式是使用
re.VERBOSE可用于提高可讀性的標志編譯的。但是,請注意,未轉義的空格將被忽略,并且在此模式下允許注釋。如果您的模式涉及空格,請確保使用\s. 如果需要匹配#字符,請使用[#].
因此,文字空格字符必須寫為[ ]or \ 。( \s,如手冊中所建議的,匹配任何空格,而不僅僅是空格字符。)
uj5u.com熱心網友回復:
我不知道為什么它不起作用
但它似乎適用于同一作者創作的狡猾
(但幾年后 - 所以他可以在寫作后獲得經驗ply)
from sly import Lexer, Parser
class MyLexer(Lexer):
tokens = { NUM, SPACE }
NUM = r'\d '
SPACE = r' '
def error(self, t):
print(f'Illegal character {t.value[0]!r}')
t.lexer.skip(1)
class MyParser(Parser):
tokens = MyLexer.tokens
@_('NUM SPACE NUM')
def two(self, p):
return ('two', p.NUM0, p.SPACE, p.NUM1)
lexer = MyLexer()
parser = MyParser()
ast = parser.parse(lexer.tokenize('1 2'))
print(ast)
編輯:
有趣的是文本't_SPACE' matches empty string,它向我建議space可能具有特殊含義,因此我進行了測驗"\ "-它有效
t_SPACE = r'\ '
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/438978.html
