层中的等效REJECT

问题描述 投票:0回答:1

层中的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中,我对此有拒绝,但在层叠上,我还找不到其他选择。

python flex-lexer lex ply
1个回答
0
投票

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中使用yylessunput或在Ply中修改lex.lexpos)并使用以下方式更改词法分析器状态来获得相似的结果开始条件。

© www.soinside.com 2019 - 2024. All rights reserved.