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_loop 或 for_loop.
明白了吗?
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_loop 或 for_loop.
明白了吗?