我正在使用python创建一个C词法分析器,作为开发解析器的一部分。在我的代码中,我已经编写了一些识别关键字,数字,运算符等的方法。编译后没有显示错误。执行时我可以输入.c文件。我的输出应该列出输入文件中的所有关键字,标识符等。但它没有显示任何东西。任何人都可以帮助我。代码已附上。
import sys
import string
delim=['\t','\n',',',';','(',')','{','}','[',']','#','<','>']
oper=['+','-','*','/','%','=','!']
key=["int","float","char","double","bool","void","extern","unsigned","goto","static","class","struct","for","if","else","return","register","long","while","do"]
predirect=["include","define"]
header=["stdio.h","conio.h","malloc.h","process.h","string.h","ctype.h"]
word_list1=""
i=0
j=0
f=0
numflag=0
token=[0]*50
def isdelim(c):
for k in range(0,14):
if c==delim[k]:
return 1
return 0
def isop(c):
for k in range(0,7):
if c==oper[k]:
ch=word_list1[i+1]
i+=1
for j in range(0,6):
if ch==oper[j]:
fop=1
sop=ch
return 1
#ungetc(ch,fp);
return 1
j+=1
return 0;
k+=1
def check(t):
print t
if numflag==1:
print "\n number "+str(t)
return
for k in range(0,2):#(i=0;i<2;i++)
if strcmp(t,predirect[k])==0:
print "\n preprocessor directive "+str(t)
return
for k in range(0,6): #=0;i<6;i++)
if strcmp(t,header[k])==0:
print "\n header file "+str(t)
return
for k in range(0,21): #=0;i<21;i++)
if strcmp(key[k],t)==0:
print "\n keyword "+str(key[k])
return
print "\n identifier \t%s"+str(t)
def skipcomment():
ch=word_list[i+1]
i+=1
if ch=='/':
while word_list1[i]!='\0':
i+=1#ch=getc(fp))!='\0':
elif ch=='*':
while f==0:
ch=word_list1[i]
i+=1
if c=='/':
f=1
f=0
a=raw_input("Enter the file name:")
s=open(a,"r")
str1=s.read()
word_list1=str1.split()
i=0
#print word_list1[i]
for word in word_list1 :
print word_list1[i]
if word_list1[i]=="/":
print word_list1[i]
elif word_list1[i]==" ":
print word_list1[i]
elif word_list1[i].isalpha():
if numflag!=1:
token[j]=word_list1[i]
j+=1
if numflag==1:
token[j]='\0'
check(token)
numflag=0
j=0
f=0
if f==0:
f=1
elif word_list1[i].isalnum():
if numflag==0:
numflag=1
token[j]=word_list1[i]
j+=1
else:
if isdelim(word_list1[i]):
if numflag==1:
token[j]='\0'
check(token)
numflag=0
if f==1:
token[j]='\0'
numflag=0
check(token)
j=0
f=0
print "\n delimiters : "+word_list1[i]
elif isop(word_list1[i]):
if numflag==1:
token[j]='\0'
check(token)
numflag=0
j=0
f=0
if f==1:
token[j]='\0'
j=0
f=0
numflag=0
check(token)
if fop==1:
fop=0
print "\n operator \t"+str(word_list1[i])+str(sop)
else:
print "\n operator \t"+str(c)
elif word_list1[i]=='.':
token[j]=word_list1[i]
j+=1
i+=1
答案 0 :(得分:1)
你的代码很糟糕。尝试将其拆分为可以单独测试的较小功能。你试过调试程序吗?一旦找到导致问题的地方,您可以回到这里并提出更具体的问题。
更多提示。你可以像这样更简单地实现isdelim
:
def isdelim(c):
return c in delim
要比较字符串是否相等,请使用string1 == string2
。 Python中不存在strcmp
。我不知道你是否意识到Python通常被解释而不是编译。这意味着如果调用不存在的函数,则不会出现编译器错误。该程序只会在到达通话时在运行时进行投诉。
在您的函数isop
中,您有无法访问的代码。永远无法联系到j += 1
和k += 1
,因为它们就在return
语句之后。
在Python中迭代一个集合就像这样:
for item in collection:
# do stuff with item
这些只是一些提示。你应该真正阅读Python Tutorial。
答案 1 :(得分:1)
def isdelim(c):
if c in delim:
return 1
return 0
您应该了解有关Python基础知识的更多信息。 ATM,您的代码包含太多if
和for
s。
尝试学习hard way。
答案 2 :(得分:0)
它似乎为我打印了相当多的输出,但代码很难遵循。我反对自己跑了,它就像这样出错:
Traceback (most recent call last):
File "C:\dev\snippets\lexical.py", line 92, in <module>
token[j]=word_list1[i]
IndexError: list assignment index out of range
老实说,这是非常糟糕的代码。你应该给函数更好的名字,不要使用这样的幻数:
for k in range(0,14)
我的意思是,您已经制作了一个可以用于该范围的列表。
for k in range(delim)
稍微有点意义。
但你只是想确定c是否在列表中,所以只需说:
if c in delim
你为什么要回1和0,这是什么意思?为什么不使用True和False。
可能还有其他几个明显的问题,比如代码的整个“主要”部分。
这不是非常pythonic:
token=[0]*50
你真的只是想说吗?
token = []
现在它只是一个空列表。
而不是尝试使用这样的计数器:
token[j]=word_list1[i]
你想要追加,像这样:
token.append (word_list[i])
老实说,我认为你的问题太难了。