首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ply中拒绝等效项

在ply中拒绝等效项
EN

Stack Overflow用户
提问于 2019-12-14 15:49:04
回答 1查看 69关注 0票数 0

什么是ply中的flex REJECT等价物?对于我的代码,我想让ply检测相同文本的标记字母和单词,但只检测字母标记。

代码语言:javascript
复制
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中,我还找不到替代方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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标记为

代码语言:javascript
复制
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 ),并使用开始条件更改词法分析器状态,可以获得类似的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59333288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档