【发布时间】:2023-04-01 22:28:01
【问题描述】:
要实现对 typedef 的支持,您需要在词法分析器识别标识符并返回不同标记时查找符号表。这在 flex lexer 中很容易完成。我正在尝试使用 boost Spirit 来构建解析器并查看示例,但它们都没有在词法分析器和解析器之间传递任何上下文信息。在 mini c 编译器教程示例中,最简单的方法是什么?
【问题讨论】:
标签: boost boost-spirit boost-spirit-lex
要实现对 typedef 的支持,您需要在词法分析器识别标识符并返回不同标记时查找符号表。这在 flex lexer 中很容易完成。我正在尝试使用 boost Spirit 来构建解析器并查看示例,但它们都没有在词法分析器和解析器之间传递任何上下文信息。在 mini c 编译器教程示例中,最简单的方法是什么?
【问题讨论】:
标签: boost boost-spirit boost-spirit-lex
这在 Spirit.Lex 中同样容易。您所需要的只是在匹配令牌之后、但在将令牌返回给解析器之前调用代码的能力。这就是词法分析器语义操作:
this->self += identifier[ lex::_tokenid = lookup(lex::_val) ];
其中lex::_tokenid 是一个占位符,表示当前令牌的令牌ID,lex::_val 表示匹配的令牌值(此时很可能这是一个指向底层输入流的iterator_range<>),并且lookup 是一个惰性函数(即函数对象,例如phoenix::function),实现了实际的查找逻辑。
我会尝试找一些时间来实现一个小示例,以添加到 Spirit 中来演示这种技术。
【讨论】:
要实现对 typedef 的支持,您需要在词法分析器识别标识符并返回不同标记时查找符号表。
这不是本末倒置吗?词法分析器的目的是获取文本输入并将其转换为简单标记流。这使得解析器更容易指定和处理,因为它不必处理诸如“这些是浮点数的可能表示”之类的低级事物。
标识符标记到符号的基于语言的映射(即:typedef)不是词法分析器应该做的事情。这是在解析阶段发生的事情,甚至可能是在抽象语法树的后期处理阶段。
或者,换句话说,qi::symbols 是解析器对象而不是词法分析器对象是有充分理由的。处理这种事情根本不是词法分析器的职责。
在任何情况下,在我看来,您想要做的是构建一种方法(在 解析器中)将标识符标记映射到表示已被 typedef 的类型的对象d。 qi::symbols 解析器似乎是做这种事情的方法。
【讨论】: