【问题标题】:How to go about adding a symbol table interface to boost::spirit::lex based lexer?如何向基于 boost::spirit::lex 的词法分析器添加符号表接口?
【发布时间】:2023-04-01 22:28:01
【问题描述】:

要实现对 typedef 的支持,您需要在词法分析器识别标识符并返回不同标记时查找符号表。这在 flex lexer 中很容易完成。我正在尝试使用 boost Spirit 来构建解析器并查看示例,但它们都没有在词法分析器和解析器之间传递任何上下文信息。在 mini c 编译器教程示例中,最简单的方法是什么?

【问题讨论】:

    标签: boost boost-spirit boost-spirit-lex


    【解决方案1】:

    这在 Spirit.Lex 中同样容易。您所需要的只是在匹配令牌之后、但在将令牌返回给解析器之前调用代码的能力。这就是词法分析器语义操作:

    this->self += identifier[ lex::_tokenid = lookup(lex::_val) ];
    

    其中lex::_tokenid 是一个占位符,表示当前令牌的令牌ID,lex::_val 表示匹配的令牌值(此时很可能这是一个指向底层输入流的iterator_range<>),并且lookup 是一个惰性函数(即函数对象,例如phoenix::function),实现了实际的查找逻辑。

    我会尝试找一些时间来实现一个小示例,以添加到 Spirit 中来演示这种技术。

    【讨论】:

    • 这个例子怎么样?
    【解决方案2】:

    要实现对 typedef 的支持,您需要在词法分析器识别标识符并返回不同标记时查找符号表。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多