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

Recursive descent parser implementation in python

python代码(3.5)中的objective是阅读标准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 --> = =|!=|<=|>=|>|<

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

int id;

while(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')

你哪里糊涂了?到目前为止你做得很好。

您不是在对单个语句类型进行编码:您是在使用通用过程对语法规则进行编码。按照语法规则 RHS 上给定的顺序查找每个标记。如果令牌是终端,请使用您的 match 例程。如果它是非终端,则调用该非终端的函数。

当你有RHS扩展的选择时,比如循环语句,你需要使用lookahead来决定调用哪个routine。您的函数 looping_stat 必须查看下一个标记并调用 while_loopfor_loop.

明白了吗?