亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python rply反向解析器

python rply反向解析器

翻閱古今 2021-12-29 20:28:15
我正在使用rplyPython3.6 為一個小型私有項目創建詞法分析器和解析器。但我注意到的是,解析器似乎翻轉了詞法流的順序。這是我正在解析的文件:let test:string = "test";print(test);詞法分析器輸出:Token('LET', 'let')Token('NAME', 'test')Token('COLON', ':')Token('NAME', 'string')Token('EQUALS', '=')Token('STRING', '"test"')Token('SEMI_COLON', ';')Token('PRINT', 'print')Token('OPEN_PARENS', '(')Token('STRING', '"test"')Token('CLOSE_PARENS', ')')Token('SEMI_COLON', ';')如您所見,它是按腳本順序排列的。我使用解析器創建一個帶有 name test、 typestring和 value的變量test。然后我想打印變量。它確實創建了變量,但是當我想打印出來時,什么也沒有。但是當我像這樣翻轉腳本時print(test);let test:string = "test";它能夠正確打印值。兩個解析器“規則”如下所示: 打?。篅self.pg.production('expression : PRINT OPEN_PARENS expression CLOSE_PARENS SEMI_COLON expression')def print_s(p):    ...創建變量:@self.pg.production('expression : LET expression COLON expression EQUALS expression SEMI_COLON expression')def create_var(p):    ...所以我的問題是:如何翻轉解析內容的順序?編輯:我在文檔中尋找了類似的問題或問題,但沒有找到任何東西。
查看完整描述

1 回答

?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

這是一個更簡單的例子;希望你能看到這個模式。

關鍵的見解是當生產的匹配被完全解析時執行縮減操作(即解析器函數)。這意味著如果一個產生式包含非終結符,則這些非終結符的動作在整個產生式的動作之前執行。

應該清楚為什么這是真的。每個生產動作取決于所有組件的語義值,在非終結符的情況下,這些值是通過運行相應的動作產生的。

現在,考慮這兩種非常相似的解析 a listof things 的方法。在這兩種情況下,我們都假設有一個基礎產生式,它識別出一個空的listlist :) 并且什么都不做。

  1. 右遞歸:

    list : thing list
  2. 左遞歸:

    list : list thing

在這兩種情況下,操作都會打印thing,這p[0]在右遞歸的情況下,p[1]在左遞歸的情況下。

右遞歸產生將導致things 以相反的順序打印,因為thing直到內部list被解析(并且它的組件被打?。┲蟛艜蛴?s 。

thing出于同樣的原因,左遞歸產生式將按從左到右的順序打印s。區別在于左遞歸情況下的 tgat,內部(遞歸)list包含初始things,而在右遞歸情況下,則list包含最終things。

如果您只是構建things的 Python 列表,這可能無關緊要,因為執行順序并不重要。它僅在此示例中可見,因為該操作具有副作用(打印值),這使得執行順序可見。

在極少數情況下確實有必要時,還有其他技術可以對操作進行排序。但最佳實踐是在語法上可行時始終使用左遞歸。左遞歸解析器效率更高,因為解析器不需要累積一堆不完整的產生式。并且左遞歸通常也更適合您的操作。

例如,在這里,左遞歸操作可以附加新值 ( p[0].append(p[1]); return p[0]),而右遞歸操作需要創建一個新列表 ( return [p[0] + p[1])。由于重復追加是平均線性時間,而重復串聯是二次的,左遞歸解析器對于大列表更具可擴展性。


查看完整回答
反對 回復 2021-12-29
  • 1 回答
  • 0 關注
  • 227 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號