Lexer和来自EBNF的C++语法分析器
Lexer and parser in C++ from EBNF
我需要为给定的语法编写一个lexer和一个解析器(我需要手工制作,而不是使用生成器)。我做了很多研究,但我仍然不知道如何编码
例如,我有(EBNF中的语法):
<Letter> ::= [A-Za-z]
<IntegerLiteral> ::=<Digit> { <Digit> }
这需要在lexer或解析器中定义吗?如何?
我知道lexer应该逐个字符读取文件并输出令牌,然后将这些令牌传递给解析器以创建解析树,但我在编码中遇到了麻烦。
您向我们展示的内容似乎定义了令牌类型。所以它进入lexer。
编写lexer的诀窍就是简单地获取输入文本(这只是一长串单独的字符),并逐一查看它们。每次查看一个字符时,都要根据上面的EBNF对其进行分类(即,它是Letter还是IntegerLiteral),然后生成适当的标记。
现在你上面的语法听起来很没有意义(它会生成单个字符和个位数的标记),所以我猜你有更多像这样的规则,它们使用这些规则来提高定义的可读性。因此,执行那些更复杂的规则。编写一个函数,用于检测字符是否与其中一个子规则匹配。
如果发现当前角色与上一个角色的类型不匹配,请完成当前角色并开始新角色。
这几乎就是它的全部。你只需要一堆布尔值来跟踪类型。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 使用基类指针调用基类的值构造函数的语法是什么?
- 很好的语法来获取对向量/数组数据的大小引用?
- C++语法运算符功能?
- C++使用 rand 定义函数语法
- 什么文件可以修改 atom 的C++语法?
- 创建模板嵌套类实例的语法?
- C++语法差异:二维和一维数组(指针算术)
- 将信息输入到下面显示的结构向量中的正确语法/格式是什么