检测RE2C中的IP地址

时间:2015-02-13 00:39:07

标签: c regex re2c

我正在尝试编写一个正则表达式来检测re2c(http://re2c.org/)中的IP地址和浮点数。这是我正在使用的正则表达式

<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在使用基于回溯的正则表达式时出现问题,因为这两个规则都有一个带有公共前缀的大数据集(例如192.132可能同时启动浮点数和ip地址)。

这是我用来首先生成tokenizer文件的命令行。 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.)

有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

@sushil,你是对的:YYMARKER是re2c API的一部分。

然而,re2c并没有“基于回溯的正则表达式”的问题,因为这两个规则都有一个大的数据集&#34;。 re2c生成的词法分析器只迭代输入一次(复杂度是线性的)。由于规则重叠,需要YYMARKER,如本例中所述:see

  

YYMARKER(第5行)是必需的,因为规则重叠:它备份最长成功匹配的输入位置。比如,我们有重叠的规则&#34; a&#34;和&#34; abc&#34;输入字符串&#34; abd&#34;:到时间&#34; a&#34;匹配那里仍然有机会匹配&#34; abc&#34;但是当lexer看到&#39; d&#39;它必须回滚。 (你可能想知道为什么YYMARKER会暴露出来:为什么不把它变成像yych这样的局部变量?原因是,所有输入指针必须由YYFILL更新,如任意大输入和YYFILL示例中所述。)

答案 1 :(得分:0)

看起来我没有正确阅读联机帮助页。根据联机帮助页,我需要手动定义变量YYMARKER以支持re2c中的回溯。以下是http://re2c.org/manual.html

的摘录
  

YYMARKER类型* YYCTYPE的l值。生成的代码保存   在YYMARKER中回溯信息。一些简单的扫描仪可能不会使用   此