1

我正在尝试编写一个正则表达式来检测 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 地址的开头)。

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

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

4

2 回答 2

2

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

然而,re2c 并没有“在基于回溯的正则表达式方面遇到问题,因为这两个规则都有一个庞大的数据集”。re2c 生成的词法分析器只对输入进行一次迭代(复杂性是线性的)。由于重叠规则,需要 YYMARKER,如本示例中所述:http ://re2c.org/examples/example_01.html :

需要 YYMARKER(第 5 行),因为规则重叠:它备份最长成功匹配的输入位置。比如说,我们有重叠的规则“a”和“abc”以及输入字符串“abd”:当“a”匹配时,仍然有机会匹配“abc”,但是当词法分析器看到“d”时,它必须回滚。(您可能想知道为什么 YYMARKER 会完全暴露:为什么不让它成为像 yych 这样的局部变量?原因是,所有输入指针都必须由 YYFILL 更新,如任意大输入和 YYFILL 示例中所述。)

于 2015-11-26T12:27:39.813 回答
0

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

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

于 2015-02-13T19:29:23.243 回答