如何用px,python中的lex来区分任何单词和特定单词?

时间:2018-06-05 16:54:01

标签: python ply

我正在编写一个程序来识别它是否是一个特定的指令,或者它是否是一个指令处理的ID,所以该程序打印的是:

  

LexToken(ID, '设置',1,0)
  LexToken(SEMICOLON, ';',1,4)

但问题是Set是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)

1 个答案:

答案 0 :(得分:2)

PLY文件explains this exact case。表面上的答案是它更喜欢与函数的正则表达式匹配,而不是与变量匹配。但是这样的关键词无论如何都不起作用:它们匹配像#34; Setser"和" Unionize"。因此,只需检查t_ID中的关键字,然后根据需要重置t.type