Tiger+JLex问题

转自http://blog.thesharpmind.com/?p=4001

 

 

使用JLex 生成Tiger语言词法分析

                                                         

 

 

问题1

问题描述:

      sample.lex生成的词法分析器在分析任何代码的时候均有未匹配的字符(“unmatched input”)输出。

 

解决方案:

      由于Jlex的说明文档包括sample.lex文件在内是针对unix操作系统来进行讨论的,在unix中一个换行符只有一个“/n而在dos里一个换行符包括两个字符“/r/n”,所以只要将sample.lex里面关于换行符的“/n”换成“/r/n”即能解决。

 

问题2

问题描述:

      cygwin中使用make命令来编译tiger.lex以及一些相关.java文件的时候,会出错,错误显示ErrorMsg.ErrorMsg 问题。

 

解决方案:

      由于在import语句中已经导入ErrorMsg这个包,所以要引用ErrorMsg这个类可以直接输入其名字。即将ErrorMsg.ErrorMsg改为ErrorMsg

 

问题3

问题描述:

      在测试Test37,38,39,47,48时不能进行正确的词法分析。

 

解决方案:

      这几个文件共同的特点是在commet语句有几行,由于TestX.tip文件是在unix系统中写的。所以换行符仍旧是“/n”,而我tiger.lex中原本写的是:

                 <COMMENT>  /r/n {newline();}

应该改成:

                   <COMMENT>  /n {newline();}

 

问题4:

问题描述:

      Comment语句中含有中文被认为是非法字符。

 

解决方案:

      tiger.lex中加入%unicode即可。

 

问题5

问题描述:

      Comment语句的嵌套问题。

 

解决方案:

      定义一个全局变量comment_count,初始值为0,在YYINITIAL状态下读入/*时,comment_count变成1,并进入COMMENT状态,并在COMMENT状态下再次遇到/*时再加一,遇到*/时减1,如果遇到最后一个*/comment_count0,则正确认出comment嵌套语句,否则,说明嵌套出错,打印出错语句。

 

问题6

问题描述:

      Comment语句不能正确识别/*….**/

 

解决方案:

      sample里面的COMMENT_TEXT定义有关,重新定义COMMENT_TEXT,变为识别除*和回车之外的字符串,然后遇到*,则进入一个新的COMMENTSTAR状态,遇*后具体的情况在这里讨论。

 

问题7

问题描述:

      Tiger语言中String里转义符号的操作。

 

 

解决方案:

      维护一个临时string对象——temp_string用来保存已经被认出string部分,在STRING状态下遇到非转移字符,将他们加入到temp_string中,遇到 / 符号,进入一个新的状态——BACKSLASH状态,遇到 /ntemp_string加入 ”/n” 并返回到STRING状态 , /t //  /” 同理,遇到/ddd,则将ddd转换成数字令为x,定义一个临时字符变量temp_char,令temp_char = x,并将temp_char加入到temp_string中,然后返回到STRING状态。在STRING状态下遇到,则return tok(sym.STRING, temp_string)

 

问题8:

问题描述:

      按照上述方法来识别STRING的问题在于,被识别出的STRING的起始位置在最后一个引号处。

 

解决方案:

      在遇到第一个引号的时候,用一个变量记住这个位置,并在遇到最后一个引号时,tok函数返回的是这个变量所记住的位置。

 

 

 

文章中有些小错误,要仔细谨慎参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值