python ply解析以明确解析函数名称和明确传递给它的参数

时间:2018-12-01 00:40:35

标签: python python-3.x python-2.7 parsing ply

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令牌。请帮忙。

0 个答案:

没有答案