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