Lexer和来自EBNF的C++语法分析器

Lexer and parser in C++ from EBNF

本文关键字:C++ 语法 语法分析 分析器 EBNF Lexer      更新时间:2023-10-16

我需要为给定的语法编写一个lexer和一个解析器(我需要手工制作,而不是使用生成器)。我做了很多研究,但我仍然不知道如何编码

例如,我有(EBNF中的语法):

<Letter> ::= [A-Za-z]
<IntegerLiteral> ::=<Digit> { <Digit> }

这需要在lexer或解析器中定义吗?如何?

我知道lexer应该逐个字符读取文件并输出令牌,然后将这些令牌传递给解析器以创建解析树,但我在编码中遇到了麻烦。

您向我们展示的内容似乎定义了令牌类型。所以它进入lexer。

编写lexer的诀窍就是简单地获取输入文本(这只是一长串单独的字符),并逐一查看它们。每次查看一个字符时,都要根据上面的EBNF对其进行分类(即,它是Letter还是IntegerLiteral),然后生成适当的标记。

现在你上面的语法听起来很没有意义(它会生成单个字符和个位数的标记),所以我猜你有更多像这样的规则,它们使用这些规则来提高定义的可读性。因此,执行那些更复杂的规则。编写一个函数,用于检测字符是否与其中一个子规则匹配。

如果发现当前角色与上一个角色的类型不匹配,请完成当前角色并开始新角色。

这几乎就是它的全部。你只需要一堆布尔值来跟踪类型。