什么是ply中的flex REJECT等价物?对于我的代码,我想让ply检测相同文本的标记字母和单词,但只检测字母标记。
import ply.lex as lex
from ply.lex import TOKEN
tokens = (
'LETTER',
'WORD'
)
@TOKEN(r'[a-zA-Z]')
def t_LETTER(t):
print('L')
return t
@TOKEN(rf'{t_LETTER}*')
def t_WORD(t):
print('W')
return t
# Error handling rule
def t_error(t):
print("Illegal character '%s'" % t.value[0])
t.lexer.skip(1)
# Build the lexer
lexer = lex.lex()
# Test it out
# Give the lexer some input
while True:
lexer.input(input())
# Tokenize
while True:
tok = lexer.token()
if not tok:
break # No more input
print(tok)当我执行输入av的代码时,输出是:L LexToken(LETTER,'a',1,0) L LexToken(LETTER,'v',1,1),但我希望也检测到令牌词。在flex中,我已经拒绝了这一点,但在ply中,我还找不到替代方案。
发布于 2019-12-14 16:25:55
在Ply中没有等价物beREJECT。但这并不是您的程序不能识别WORD令牌的原因;这些令牌之所以不被识别,是因为当Python扩展f'{t_LETTER}*'时,它不会生成'[a-zA-Z]*',因为t_LETTER的值是一个函数,而不是字符串。
在(f)lex中的WORD操作中使用REJECT可能也不是您想要的,但在任何情况下,REJECT都是一个效率极低的操作,不推荐用于现代代码。Flex会将abcd标记为
WORD abc
WORD ab
WORD a
LETTER a
WORD bcd
WORD bc
WORD b
LETTER b
WORD cd
WORD c
LETTER c
WORD d
LETTER d也许这就是你所期望的,但对我来说似乎有点奇怪。在Ply和flex中,通过组合使用将字符推回到输入流中(在flex中使用yyless或unput,或者在Ply中修改lex.lexpos ),并使用开始条件更改词法分析器状态,可以获得类似的结果。
https://stackoverflow.com/questions/59333288
复制相似问题