层中的flex REJECT等效项是什么?对于我的代码,我希望ply检测相同文本的令牌LETTER和WORD,但仅检测LETTER令牌。
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的代码时,输出为:大号LexToken(字母,'a',1,0)大号LexToken(字母,'v',1,1)但是我希望令牌WORD也能被检测到。在flex中,我对此有拒绝,但在层叠上,我还找不到其他选择。
Ply中没有等于REJECT
的对象。但这不是您的程序无法识别WORD
令牌的原因。无法识别它们,因为当Python扩展f'{t_LETTER}*'
时,由于'[a-zA-Z]*'
的值是一个函数,而不是字符串,因此它不会产生t_LETTER
。
(f)lex中的REJECT
操作中使用WORD
可能也不是您想要的,但是在任何情况下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
)并使用以下方式更改词法分析器状态来获得相似的结果开始条件。