首页 > 解决方案 > python - 如何使用 lex in ply、python 区分任何单词和特定单词?

问题描述

我正在编写一个程序,它可以识别它是特定指令还是要处理的指令的 ID,因此该程序打印的是:

LexToken(ID,'Sets',1,0)
LexToken(分号,';',1,4)

但问题是 Sets 是 CMDSETS 而不是 ID 那么我如何比较它是指令还是常规 ID?

编码:

import ply.lex as lex
import ply.yacc as yacc


tokens = [
    'CMDSETS',
    'CMDUNION',
    'ID',
    'COLON',
    'SEMICOLON',

    ]
t_CMDSETS=r'Sets'
t_CMDUNION=r'Union'
t_COLON= r','
t_SEMICOLON=r';'


def t_ID(t):
    r'[a-zA-Z_][a-zA-Z0-9_]*'
    t.type='ID'
    return t

t_ignore=r' '

def t_error(t):
    print("This thing failed")
    t.lexer.skip(1)

lexer=lex.lex()

lexer.input("Sets;")

while True:
    tok=lexer.token()
    if not tok:
        break
    print(tok)

标签: pythonply

解决方案


PLY 文档解释了这种确切的情况。肤浅的答案是它更喜欢匹配来自函数而不是来自变量的正则表达式。但是这样的关键字无论如何都不起作用:它们会匹配“Setser”和“Unionize”之类的东西。因此,只需检查关键字并在需要时t_ID重置。t.type


推荐阅读