我正在尝试使用flex&bison自动生成一个fortran词法分析器和解析器,但是,在扫描以下fortran语言时遇到错误:
“ if(i.le.20.and.j.le.10)”
我发现的原因是“。and。” 是fortran语法中的逻辑运算符,而浮点数可以写为“ 20。” 。因此我的词法分析器将“ 20。” 识别为浮点数,这是基于规则“匹配尽可能长的字符串” ,而左字符串” and.j.le.10“ 没有匹配的规则。
那么我该如何解决这个问题呢?
答案 0 :(得分:1)
使用lex和yacc无法解决该问题。尽管偶尔回溯了yacc实现,但这里的问题在lex级别。在 成功 标记使规则失败之前,词法分析器必须连续测试更长的字符串,直到尽可能长的时间为止。 lex并没有这样做:它在输入流中前进,仅备份以解决 current 令牌中的歧义。无论是lex还是flex,答案都是相同的。
其他人则使用专门编写的词法分析器解决了这个问题。例如,您可以读取整行并将其递归地拆分为标记。在每个提议的标记之后,词法分析器将从该点重新开始,寻找下一个标记。如果都不适合(例如 and.
),则词法分析器将返回错误。递归只有在到达行尾时才能完成。
使用Fortran 90's free form非常简单。在早期版本中,空格基本上无关紧要(I / O格式除外)。
进一步阅读:
答案 1 :(得分:0)
You may have to preprocess the file to modify such lines to
if((i.le.20) .and. (j .le. 10)) then