编译原理词法分析器调试过程记录

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)})

终于!词法分析器完成!

 哦耶!充实的一天!明天开始项目视频代码调试!加油呀!冲冲冲!

附上咱亲爱的全老师的名言:

定能生慧,静纳百川!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值