我正在使用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語法規則週期導致無限遞歸:
- name =>
- selected_component =>
- prefix =>
- name
注意,這問題不是一個特定於Ada的問題,而是相關的包含左遞歸規則的所有語法。
如果您複製問題中的原始語法規則,這將有所幫助。 – Apalala 2013-03-16 16:01:10
@Apalala:我添加了鏈接到語法規則。 – 2013-03-20 13:46:19