我试图编写一个regex来检测re2c中的IP地址和浮点数(http://re2c.org/)。这是我用的正则表达式
<SYMBOL> [-+]?[0-9]+[.][0-9]+ { RETURN(FLOAT); }
<SYMBOL> [0-9]{1,3}'.'[0-9]{1,3}'.'[0-9]{1,3}'.'[0-9]{1,3} {RETURN (IPADDR); }
每当我编译时,它就会抛出一些YYMARKER未声明的错误。但如果我只使用其中一个规则,编译就可以了。我猜re2c在基于回溯的regex上遇到了问题,因为这两个规则都有一个带有公共前缀的大数据集(例如192.132可以同时以浮点数和ip地址开头)。
下面是我第一次生成标记器文件时使用的命令行。re2c本身不会抛出任何错误。
re2c -c -o tokenizer.c tokenizer.re
但是当我编译C文件时,我得到了以下错误。
tokenizer.c: In function 'getnext_querytoken':
tokenizer.c:74: error: 'YYMARKER' undeclared (first use in this function)
tokenizer.c:74: error: (Each undeclared identifier is reported only once
tokenizer.c:74: error: for each function it appears in.)
我有办法解决这个问题吗?
最佳答案
@寿司,你说得对:YYMARKER是re2c API的一部分。
然而,re2c“不存在基于回溯的regex的问题,因为这两个规则都有一个大的数据集”。Re2c生成的词典只重复输入一次(复杂性是线性的)。由于规则重叠,需要YYMARKER,如本例中所述:http://re2c.org/examples/example_01.html:
需要YYMARKER(第5行),因为规则重叠:它备份最长成功匹配的输入位置。例如,我们有重叠的规则“a”和“abc”以及输入字符串“abd”:当“a”匹配时,仍然有机会匹配“abc”,但是当lexer看到“d”时,它必须回滚。(您可能想知道为什么YYMARKER会公开:为什么不将它设为像yych这样的局部变量呢?原因是,所有输入指针都必须由YYFILL更新,如任意大输入和YYFILL示例中所述。)
关于c - 在RE2C中检测IP地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28490603/