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')
答案 0 :(得分:1)
您没有对单个语句类型进行编码:您使用通用流程来编写语法规则。按照语法规则的RHS上给出的顺序查找每个标记。如果令牌是终端,请使用匹配例程。如果它是非终端,请调用非终端的功能。
当您可以选择RHS扩展时,例如使用循环语句,您需要使用前瞻来决定调用哪个例程。您的函数 looping_stat 必须查看下一个令牌并调用 while_loop 或 for_loop 。
知道了吗?