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