使用lex进行标记而不会失败

时间:2015-06-23 21:03:32

标签: yacc lex

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

任何人都有类似这样的经历吗?

2 个答案:

答案 0 :(得分:1)

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

如果要将相邻的非匹配字符组合成单个标记,那就更难了,并且在解析器中更容易完成。

答案 1 :(得分:1)

要扩展@Chris Dodd的答案,任何 lex 脚本中的最终规则应为:

. return yytext[0];

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

这种做法:

  • 为您节省了很多 lex 规则
  • 使您的语法更具可读性
  • 将非法字符作为标记返回给解析器,您可以在其中执行任何您喜欢的操作,或者不执行任何操作,在这种情况下,您可以获得 yacc 错误恢复的好处。