[英]Generic Recursive Descent Parser for validating strings using Lex and C
编辑:使用 Lex (flex) 我需要在 C 中编写递归下降解析器。解析器将使用受限上下文无关语法以及给定的一个或多个字符串读取描述 NFA 的输入以进行验证。 我需要读取并存储 NFA,然后为每个字符串确定它是否使用该语言。 示例输入文件可能如下所示:
A -> ab A1
A1-> ab A
A -> ε
abab
aba
因此解析器应该给出以下 output:
Accept abab
Accept
Reject aba
输入文件的语法:
input --> grammar strings
grammar --> grammar production
| production
production --> NT ARROW T NT EOL
| NT ARROW NT EOL
| NT ARROW EOL
strings --> strings string EOL
| string EOL
string --> string T
| /* epsilon */
我无法理解我们如何仅使用 Lex 和 C 程序来创建一个解析器,该程序适用于动态语法,这意味着编写的代码也应该适用于其他语法。
比方说接受奇数个 a 的例子:
S -> 0
S -> 1
S -> 0 0 S
S -> S 1 1
至于实现这种生成器的可能方法,将是存储所有规则的列表。
每个规则都有一个“依赖项”列表。 与规则A
一样,它有两个条目,一个具有依赖关系ab
和 `A1,另一个具有空依赖列表(即 ε)。
对于解析器本身的生成,您迭代(排序的)规则列表。 当您到达A
时,您的程序将 function header 写入目标源文件。
对于ab
和A1
依赖链,它随后添加了对终端ab
的检查,如果匹配则调用 function A1
(稍后将生成)。
由于A
有两条规则,因此您的生成器随后会为第二条规则创建一个else
。 因为它是 ε,所以else
分支什么都不做。
当A
没有更多规则时,结束 function。
对于规则A1
,您的操作类似:创建一个 function header,检查ab
,如果找到则调用A
不同之处在于,您可以在此处添加引发语法错误的else
。
写入目标源文件的生成代码看起来像这样(添加了 function 原型):
#include "my_parser_generator_functions.h"
void A(void);
void A1(void);
void A(void)
{
if (match("ab"))
{
A1();
}
else
{
// ε
}
}
void A1(void)
{
if (match("ab"))
{
A();
}
else
{
syntax_error("Expected %s", "ab");
}
}
请注意,所有这些只是我当时编造的东西,我从来没有制作过解析器生成器(但我制作了很多解析器,既有基于 Yacc/Bison 的,也有递归体面的)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.