python中的递归下降解析器实现

时间:2017-02-28 20:28:06

标签: python string-matching recursive-descent

python代码(3.5)的目标是读取以下规则的标准C代码:

Program  --> main () { declarations   statement-list } 
declarations--> data-type identifier-list; declarations |epsilon  
data-type --> int|char identifier-list --> id|id, identifier-list   
statement_list --> statement   statement_list| epsilon 
statement -->    looping-stat 
looping-stat --> while (expn) {assignment_stat} |
        for    (assignment_stat ; expn ; increment_stat )       { assignment_stat }    
expn--> factor eprime 
eprime-->relop factor|epsilon 
assignment_stat    --> id = factor 
increment_stat --> id  inc_dec 
inc_dec --> ++|-- 
factor --> id|num 
relop --> = =|!=|<=|>=|>|<

我知道该方法是使用连续的过程调用(例如,对于main()调用声明()和使用它的语句)。想法是将文本中的行读入列表并尝试解析它。我对宣言等规则感到困惑。例如

  

int id;

  

而(a和小于100)

任何帮助将不胜感激。

试用代码:

#for input
def file_input():
    global buffer,lookahead

    buffer=list()
    file=open("parser.txt","r")
    lines=file.readlines()
    file.close()
    for line in lines:
        line=line.strip()
        #print(line)
        buffer.append(line)

    return(buffer)

#for the while loop
def while_loop():
    global lookahead,buffer

    if "while_loop" in buffer[lookahead]:
        print("Parsing",buffer[lookahead])
        match('while_loop')
        expression()
        assignment()

#matching   
def match(t):
    global lookahead,buffer

    print('matching', t)
    if buffer[lookahead] == "t":
        lookahead = lookahead + 1
    else:
        print('error')

1 个答案:

答案 0 :(得分:1)

你在哪里困惑?到目前为止,你做得很好。

您没有对单个语句类型进行编码:您使用通用流程来编写语法规则。按照语法规则的RHS上给出的顺序查找每个标记。如果令牌是终端,请使用匹配例程。如果它是非终端,请调用非终端的功能。

当您可以选择RHS扩展时,例如使用循环语句,您需要使用前瞻来决定调用哪个例程。您的函数 looping_stat 必须查看下一个令牌并调用 while_loop for_loop

知道了吗?