【问题标题】:A context dependent Fortran scanner上下文相关的 Fortran 扫描器
【发布时间】:2019-06-02 17:53:40
【问题描述】:

我正在尝试使用 flex & bison 自动生成 fortran 词法分析器和解析器,但是,在扫描以下 fortran 语言时遇到错误: “如果(i.le.20.and.j.le.10)”
我发现的原因是,".and." 是 fortran 语法中的逻辑运算符,而浮点数可以写为 "20."。所以我的词法分析器会将 "20." 识别为浮点数,基于规则 “匹配最长可能的字符串”,而左边的字符串 ” and.j.le.10" 没有可匹配的规则。 那么我该如何解决这个问题呢?

【问题讨论】:

    标签: flex-lexer


    【解决方案1】:

    你不能用 lex 和 yacc 解决这个问题。虽然偶尔会回溯 yacc 实现,但这里的问题在于 lex 级别。词法分析器必须连续测试更长的字符串,直到 succeeding 标记不符合规则为止。 lex 不这样做:它通过输入流前进,仅备份以解决 current 标记中的歧义。无论是 lex 还是 flex,答案都是一样的。

    其他人使用专门编写的词法分析器解决问题。例如,您可以读取整行并递归地将其拆分为标记。在每个提议的令牌之后,词法分析器将从该点递归,寻找下一个令牌。如果没有合适的(例如 and.),词法分析器将返回错误。递归只有在到达行尾时才会完成。

    Fortran 90's free form 相当简单。在早期版本中,空白在很大程度上是无关紧要的(I/O 格式除外)。

    进一步阅读:

    【讨论】:

      【解决方案2】:

      您可能需要预处理文件以将这些行修改为

      if((i.le.20) .and. (j .le. 10)) then
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-04
        相关资源
        最近更新 更多