转自http://blog.thesharpmind.com/?p=4001
问题描述:
用sample.lex生成的词法分析器在分析任何代码的时候均有未匹配的字符(“unmatched input”)输出。
解决方案:
由于Jlex的说明文档包括sample.lex文件在内是针对unix操作系统来进行讨论的,在unix中一个换行符只有一个“/n”, 而在dos里一个换行符包括两个字符“/r/n”,所以只要将sample.lex里面关于换行符的“/n”换成“/r/n”即能解决。
问题描述:
在cygwin中使用make命令来编译tiger.lex以及一些相关.java文件的时候,会出错,错误显示ErrorMsg.ErrorMsg 问题。
解决方案:
由于在import语句中已经导入ErrorMsg这个包,所以要引用ErrorMsg这个类可以直接输入其名字。即将ErrorMsg.ErrorMsg改为ErrorMsg。
问题描述:
在测试Test37,38,39,47,48时不能进行正确的词法分析。
解决方案:
这几个文件共同的特点是在commet语句有几行,由于TestX.tip文件是在unix系统中写的。所以换行符仍旧是“/n”,而我tiger.lex中原本写的是:
<COMMENT> /r/n {newline();}
应该改成:
<COMMENT> /n {newline();}
问题描述:
Comment语句中含有中文被认为是非法字符。
解决方案:
在tiger.lex中加入%unicode即可。
问题描述:
Comment语句的嵌套问题。
解决方案:
定义一个全局变量comment_count,初始值为0,在YYINITIAL状态下读入/*时,comment_count变成1,并进入COMMENT状态,并在COMMENT状态下再次遇到/*时再加一,遇到*/时减1,如果遇到最后一个*/时comment_count为0,则正确认出comment嵌套语句,否则,说明嵌套出错,打印出错语句。
问题描述:
Comment语句不能正确识别/*….**/。
解决方案:
和sample里面的COMMENT_TEXT定义有关,重新定义COMMENT_TEXT,变为识别除*和回车之外的字符串,然后遇到*,则进入一个新的COMMENTSTAR状态,遇*后具体的情况在这里讨论。
问题描述:
对Tiger语言中String里转义符号的操作。
解决方案:
维护一个临时string对象——temp_string用来保存已经被认出string部分,在STRING状态下遇到非转移字符,将他们加入到temp_string中,遇到 / 符号,进入一个新的状态——BACKSLASH状态,遇到 /n,temp_string加入 ”/n” 并返回到STRING状态 , /t 、// 、 /” 同理,遇到/ddd,则将ddd转换成数字令为x,定义一个临时字符变量temp_char,令temp_char = x,并将temp_char加入到temp_string中,然后返回到STRING状态。在STRING状态下遇到”,则return tok(sym.STRING, temp_string)。
问题描述:
按照上述方法来识别STRING的问题在于,被识别出的STRING的起始位置在最后一个引号处。
解决方案:
在遇到第一个引号的时候,用一个变量记住这个位置,并在遇到最后一个引号时,tok函数返回的是这个变量所记住的位置。