from ply import lex, yacc
import itertools
reserved = {
'(?i)fun1' : 'FUN1',
'(?i)fun2' : 'FUN2'
}
tokens = [
'PARAM',
'FUNC_NAME',
'LP',
'RP'
]
tokens += reserved.values()
t_PARAM = r'[^\s\(\),&:\"\'~]+'
def t_LP(t):
r'\('
return t
def t_RP(t):
r'\)'
return t
def t_FUNC_NAME(t):
r'[a-zA-Z][a-zA-Z0-9.]*'
if t.value in reserved:
t.type = reserved[ t.value ]
return t
def t_newline(t):
r'\n+'
t.lexer.lineno += len(t.value)
t_ignore = ' \t'
def t_error(t):
print("Illegal character '%s' on line %d, column %d" % (t.value[0],
t.lexer.lineno, t.lexer.lexpos))
t.lexer.skip(1)
def build_lexer():
lexer = lex.lex()
query = "fun1(brownfox)"
lexer.input(query)
while True:
tok = lexer.token()
if not tok:
break
print(tok)
build_lexer()
У меня будет похожая грамматика (правила грамматики yacc выглядят следующим образом):
выражение: FUNC_NAME (PARAM)
выражение: PARAM
Запросы нанапример:
1. FUN1(parameter1)
должно быть проанализировано, как показано ниже:
FUN1 -> FUNC_NAME (как зарезервированное слово)
параметр1 -> ПАРАМ
2.) FUN2(parameter2)
его следует проанализировать, как показано ниже:
FUN2 -> FUNC_NAME (как зарезервированное слово)
параметр2 -> PARAM
3.) xyz
он должен быть проанализирован, как показано ниже:
xyz -> PARAM
4.) fun3(xyz)
он должен быть разобран, как показано ниже:
fun3 -> FUNC_NAME (не зарезервированное слово, а в форме func_name (param))
xyz -> PARAM
5.) fun4(xyz)
должно быть проанализировано, как показано ниже:
fun4 -> FUNC_NAME (не зарезервированное слово, но оно в формеиз func_name (param))
xyz -> PARAM
Но здесь проблема заключается вПараметр, передаваемый в имя функции, также анализируется как FUNC_NAME
.
Что я должен сделать, чтобы выражения, содержащие круглые открывающие и закрывающие скобки, анализировались как имя функции как FUNC_NAME
токен и параметр как PARAM
токен.Пожалуйста, помогите.