c++ - (F)莱克斯 : get text not matched by rules/get default output

标签 c++ bison yacc lex flex-lexer

到目前为止,我已经阅读了很多关于 (F)Lex 的内容,但我找不到答案。 其实我有 2 个问题,得到一个答案就足够了。

我有这样的字符串:

TOTO 123 CD123 RGF 32/FDS HGGH

对于我找到的每个标记,我将其放入一个 vector 中。例如,对于这个字符串,我得到一个这样的 vector :

vector = TOTO, whitespace, CD, 123, whitespace, RGF, whitespace, 32, FDS, whitespace, HGGH

“/”不匹配任何规则,但我仍然想在到达它时将它放入我的 vector 中并得到:

vector = TOTO, whitespace, CD, 123, whitespace, RGF, whitespace, 32, /, FDS, whitespace, HGGH

所以我的问题是:

1) 当输入不匹配任何规则时,是否有可能修改默认操作? (而不是在标准输出上打印?)

2) 如果不可能,如何捕获它?因为在这里,“/”是一个示例,但它可以是所有内容(不符合我的规则的 % 、C、3、Blabblabla 等),我不能放

 .*   { else();  }

因为 Flex 使用匹配最长字符串的正则表达式。我希望我的规则被“排序”,而“.*”将排在最后,就像更改 Flex 的“首选项”一样。

有什么想法吗?

最佳答案

通常的方法是制定类似这样的规则

.    { do_something_with_extra_char(*yytext); }

在规则的末尾。这将匹配任何不匹配任何其他规则的单个字符(除了换行符——你还需要一个匹配换行符的规则)。如果您有多个不匹配的字符,此规则将触发多次,但通常没问题。

关于c++ - (F)莱克斯 : get text not matched by rules/get default output,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22177413/

相关文章:

c - lex 和 yacc 之前的第二个输入中存在语法错误

grammar - 在 Linux 上使用 Bison --graph=[file] 的技巧

grammar - Flex/Bison (Lex/Yacc) 无法比拟的简单正则表达式模式

c - 带有 LEX 和 YACC 的解析器

C++ 动态大小数组

c++ - FL_输入到字符串中

c++ - 为什么 C++ 程序会为局部变量分配比最坏情况下所需更多的内存?

c++ - 是否可以在 C++ 中强制使用 "this"关键字?

c++ - 将 STL 容器从 Flex 传递到 Bison

c - flex 'yyval' 未声明