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(保留字)
parameter1-> PARAM
2。)FUN2(parameter2)
应按以下方式进行解析:
FUN2-> FUNC_NAME(保留字)
parameter2-> 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
令牌。请帮忙。