我试图编写一个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/

10-11 18:18