Как можно отличить любое слово от конкретного слова с помощью lex в ply, python? - PullRequest
0 голосов
/ 05 июня 2018

Я пишу программу, которая распознает, является ли она конкретной инструкцией или является идентификатором для инструкции, которую нужно обработать, так что эта программа печатает:

LexToken (ID, 'Sets',1,0)
LexToken (SEMICOLON, ';', 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)

1 Ответ

0 голосов
/ 05 июня 2018

Документация PLY объясняет именно этот случай .Поверхностный ответ заключается в том, что он предпочитает совпадать с регулярным выражением из функции, а не из переменной.Но такие ключевые слова в любом случае не работают: они соответствуют таким вещам, как «Setser» и «Unionize».Так что просто проверьте ключевые слова в t_ID и сбросьте t.type при необходимости.

...