emmm,上图是某次运行的结果,就离谱了。。。加油小马!找出bug!解决它!今天一定要写出正确的词法分析器!!!冲冲冲!
这是测试代码段,位于根目录下面的C_programmer.txt中
void hanoi(int n, char a, char b, char c)
{
if(n == 1)
{
count++;
printf("%c->%c\n",a,c);
}
else
{
hanoi(n - 1, a ,c, b);
count++;
printf("%c->%c\n",a,c);
hanoi(n - 1, b ,a, c);
}
}
int main()
{
int n;
scanf("%d",&n);
hanoi(n, 'a', 'b', 'c');
printf("move_times:%d\n",count);
return 0;
}
通过过滤器过滤之后:
void hanoi(int n, char a, char b, char c)
{
if(n == 1)
{
count++;
printf("%c->%c",a,c);
}
else
{
hanoi(n - 1, a ,c, b);
count++;
printf("%c->%c",a,c);
hanoi(n - 1, b ,a, c);
}
}
int main()
{
int n;
scanf("%d",&n);
hanoi(n, 'a', 'b', 'c');
printf("move_times:%d",count);
return 0;
}
说明咱过滤器的结果还是正确的!应该是下面的扫描程序出了问题。。。。
嘿嘿,该问题成功解决!
原因是:当word最后添加的是空格的时候,空格是不算入有意义的字符里面的,因此在使用
word = word[:-1]
去掉单词后其他内容的时候,需要排除空格的情况,避免错误删除了有意义的字符,即需要先进行判断:
if not line[i].isspace():
唉,再解决程序卡在第三行运算符的识别问题吧,加油!
终于让我找到if编号正确但是保存在token中却错误的原因了:多了一个切片!
目前最大的问题就是为啥EXCEL中只写入了Token中的一部分呢?明明我的Token都分析完了!
调试发现还是到第三次就中断了!不是表格自动显示的原因,初步推测可能是n后多了一个空格的原因:
于是乎,我再每个word后面都进行了去空白操作再加入word_line中:
但是,结果还是卡在了第三行!!!说明应该不是空格的原因!!!
好吧,应该就是向excel中写入==出错了
被迫改成用openpyxl库写入token。。。
终于可以正常显示啦(hh虽然自动帮我把等号修复成空格了)!也大致明白了错误原因啦!
补录一下excel表不能写入==的解决方案吧!代码如下,其实就是用赋值的英文代替了==,实在没有搜找到向excel中输入==的转义符呢!
# 字符是运算符——可由一个或者两个字符组成,两个字符中的第一个也在运算符表中
elif line[i] in operator:
s = line[i] + line[i+1]
# 两个字符组成的运算符
if s in operator:
# 由于excel中不太支持直接输入==,所以就用赋值符号的英文代替了
if s == '==':
s = 'Assignment symbol'
word_line.append({s: len(reserve_word) + len(seperator) + operator.index('==')})
else:
word_line.append({s:len(reserve_word)+len(seperator)+operator.index(s)})
i += 1
# 一个字符组成的运算符
else:
word_line.append({line[i]:len(reserve_word)+len(seperator)+operator.index(line[i])})
显示结果图如下(else也能正常显示!!!):
emmm,老师要求用二元组输出结果,于是乎,我又修改了一下程序,保留原来excel结果表的基础下,把二元式结果也写入了新建的txt文件中
在分析结果的过程中,我发现之前的第八行只有单独的一个else,结尾没有空格和界符,所以程序无法识别,输出的word_line就是空,为了修复这个bug,我增添了如下代码:
# 针对只有一个单词的情况进行处理: if word_line == []: # 只可能是关键字????比如else,不能直接判断line,line后面有换行符 # print(line) s = line.replace('\n', '') if s in reserve_word: # 以字典形式存入列表中 word_line.append({s: reserve_word.index(s)})
终于!词法分析器完成!
哦耶!充实的一天!明天开始项目视频代码调试!加油呀!冲冲冲!
附上咱亲爱的全老师的名言:
定能生慧,静纳百川!