синтаксический анализ python для анализа имени функции и однозначно переданного ей параметра - PullRequest
0 голосов
/ 01 декабря 2018
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 токен.Пожалуйста, помогите.

...