如何向基于boost::spirit::lex的lexer添加符号表接口?

如何向基于boost::spirit::lex的lexer添加符号表接口?,boost,boost-spirit,boost-spirit-lex,Boost,Boost Spirit,Boost Spirit Lex,要实现对typedef的支持,您需要在lexer识别标识符并返回不同令牌时查找符号表。这在FlexLexer中很容易实现。我试图使用boost Spirit构建解析器,并在示例中进行了介绍,但没有一个示例在lexer和解析器之间传递任何上下文信息。在minic编译器教程示例中,最简单的方法是什么 要实现对typedef的支持,您需要在lexer识别标识符并返回不同令牌时查找符号表 这不是本末倒置吗?lexer的目的是获取文本输入并将其转换为简单标记流。这使得解析器更容易指定和处理,因为它不必处理

要实现对typedef的支持,您需要在lexer识别标识符并返回不同令牌时查找符号表。这在FlexLexer中很容易实现。我试图使用boost Spirit构建解析器,并在示例中进行了介绍,但没有一个示例在lexer和解析器之间传递任何上下文信息。在minic编译器教程示例中,最简单的方法是什么

要实现对typedef的支持,您需要在lexer识别标识符并返回不同令牌时查找符号表

这不是本末倒置吗?lexer的目的是获取文本输入并将其转换为简单标记流。这使得解析器更容易指定和处理,因为它不必处理诸如“这些是浮点的可能表示”之类的低级问题

基于语言的标识符标记到符号(即:typedef)的映射不是lexer应该做的事情。这是在解析阶段发生的事情,甚至可能是以后作为抽象语法树的后处理发生的事情

或者,换句话说,
qi::symbols
是解析器对象而不是lexer对象,这是有充分理由的。处理这类事情根本不是lexer的事


在任何情况下,在我看来,您想要做的是构建一种方法(在解析器中)将标识符标记映射到一个表示已定义类型的对象。一个
qi::symbols
解析器似乎是做这类事情的方法。

这在Spirit.Lex中同样简单。您所需要的只是能够在匹配令牌之后,但在将令牌返回给解析器之前调用代码。这就是lexer语义动作:

this->self += identifier[ lex::_tokenid = lookup(lex::_val) ];
其中,
lex::_-tokenid
是一个占位符,表示当前令牌的令牌id,
lex::_-val
表示匹配的令牌值(此时很可能是一个指向底层输入流的
iterator\u range
),查找是一个延迟函数(即函数对象,如
phoenix::function
)实现实际的查找逻辑


我将试着找些时间来实现一个小示例,添加到Spirit中,演示这项技术。

这个示例怎么样?