2011-05-11 72 views
11

我正在爲使用縮進等非常複雜的配置文件編寫解析器。我決定使用Lex將輸入分解爲令牌,因爲它似乎使生活更輕鬆。問題是,我找不到任何使用Qi錯誤報告工具(on_error)的解析器的示例,這些解析器在令牌流而不是字符上操作。Boost.Spirit:Lex + Qi錯誤報告

on_error中使用的錯誤處理程序需要一些能夠精確地指示錯誤在輸入流中的位置。所有的例子只是從這對迭代器構造std::string並打印它們。但是,如果使用Lex,那麼迭代器就是令牌序列的迭代器,而不是字符。在我的程序中,在我注意到無效的迭代器類型之前,這導致在std::string構造函數中掛起。

據我所知,令牌可以持有一對迭代器作爲其輸入流的值。這是默認的屬性類型(如果類型是lex::lexertl::token<>)。但是如果我想讓我的令牌包含更多用於解析的東西(intstd::string等),那些迭代器就會丟失。

如何在使用Lex和Qi時生成指示輸入流中位置的人性化友好錯誤消息?有沒有這種用法的例子?

謝謝。

+0

@justsomebody感謝您的編輯:) – sehe 2012-10-11 12:39:29

回答

10

對不起,對於遲到的回覆,但花了一些時間準備一個你想要實現的體面的例子。我現在爲Spirit添加了一個新的詞法分析示例:conjure_lexer。它是實現小型編程語言的conjure(Qi)示例的修改版本。主要區別在於它使用的是詞法分析器而不是純粹的Qi語法。

conjure_lexer示例演示幾件事情: a)其是使用新的position_token類,它擴展了現有token類型。它總是存儲指向相應匹配輸入序列的迭代器對(除了像令牌id,令牌值等通常的信息外)。 b)它正在使用這個位置信息進行錯誤報告 c)並且沿着這些線條展示瞭如何使用詞法分析器來簡化語法。

新的例子是在SVN(中繼),並將在Boost V1.47(即將發佈)中可用。它位於以下目錄中:$ BOOST_ROOT/libs/spirit/example/qi/compiler-tutorial/conjure_lexer。

+0

非常感謝,Hartmut! – 2011-06-07 05:19:37

+2

只是一個更新:該示例已在SVN中更名爲conjure2。 – hkaiser 2011-06-07 13:03:37