【问题标题】:Using lex to tokenize without failing使用 lex 进行标记而不会失败
【发布时间】:2015-06-23 21:03:31
【问题描述】:

我有兴趣使用lex 标记我的输入字符串,但我不希望它可能“失败”。相反,我想要某种类型的 DEFAULTTEXT 令牌,其中包含已识别令牌之间的所有不匹配字符。

有人有类似的经验吗?

【问题讨论】:

    标签: yacc lex


    【解决方案1】:

    在所有 lex 规则的末尾使用模式 . 来匹配任何其他规则不匹配的任何字符。您可能还需要 \n 规则来匹配换行符(换行符是 . 不匹配的唯一字符)

    如果你想将相邻的不匹配字符组合成一个标记,这更难,并且在解析器中更容易完成。

    【讨论】:

      【解决方案2】:

      为了扩展@Chris Dodd 的回答,任何 lex 脚本中的最终规则应该是:

      . return yytext[0];
      

      并且不要编写像"+" return PLUS; 这样的单字符规则。只需使用您在语法中直接识别的特殊字符,例如term: term '+' factor;.

      这种做法:

      • 为您节省了很多lex规则
      • 让您的语法更具可读性
      • 将非法字符作为标记返回给解析器,在那里您可以对它们做任何您喜欢的事情,或者什么也不做,在这种情况下,您将受益于 yacc 的错误恢复。

      【讨论】:

      • 在你的语法中使用双引号是行不通的——你需要使用单引号。当然,你需要在 lex 中使用双引号——单引号在那里不起作用。
      • @ChrisDodd 谢谢,我已经很久没有这样做了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多