2013-03-15 53 views
2

我正在使用Pyparsing和參考手冊語法規則實現Ada 2005分析器。我們需要這個來分析和將我們老化的Ada代碼庫的一部分轉換爲C/C++。使用參考手冊語法分析Ada 2005作用域標識符時的堆棧溢出語法

大部分工作。

然而,一個小惱人的問題仍然是:

語法規則name解析作用域標識符(規則selected_component)如表達式時"Global_Types.Integer2"失敗,因爲它是一個左結合語法規則循環的一部分。

我相信這個規則寫得不對:子規則direct_name應該放在子規則direct_name之後。事實上,它應該放在最後的替代品列表中。否則,direct_name,然後name只匹配"Global_Types",然後期望字符串在此之後結束。不是我想要的。

因此,我現在將規則direct_name移動到name的末尾 - 替代方案...但是接着我得到一個Pyparsing無限遞歸,並且Python吐出超出最大遞歸深度。

我相信問題要麼由事實

  • 語法規則的關聯selected_component是造成從右到左。我搜索了Pyparsing的參考手冊,但沒有找到任何相關的內容。我們是否應該將點(.)作爲具有從右到左的關聯性的運算符來處理,還是可以通過擴展和重構語法規則來解決它?

  • 或者由於在Pyparsing無限遞歸中沒有檢查。我相信這不會太難實施。使用當前活動規則(函數)中的地圖來源位置/偏移量(getTokensEndLoc()),並且如果當前源輸入位置/偏移量等於與剛剛輸入的規則相關的位置,則總是失敗。

Recursive expressions with pyparsing可能與我的問題有關。

這個問題也似乎與Need help in parsing part of python grammar 很不相關,但很不幸沒有答案。

這裏的阿達2005語法規則週期導致無限遞歸:

注意,這問題不是一個特定於Ada的問題,而是相關的包含左遞歸規則的所有語法。

+1

如果您複製問題中的原始語法規則,這將有所幫助。 – Apalala 2013-03-16 16:01:10

+0

@Apalala:我添加了鏈接到語法規則。 – 2013-03-20 13:46:19

回答