解析py中文語法規則經驗教訓.

單輸入: 新行 | 簡單語句 | 複合語句 新行
文件輸入: (新行 | 語句)* 尾標記
求值輸入: 測試列表 新行* 尾標記

修飾器: '@' 打點名 [ '(' [參數列表] ')' ] 新行
裝飾器: 修飾器+
修飾: 裝飾器 (定義類 | 函數定義 | 異步函數定義)

異步函數定義: 異步 函數定義
函數定義: '定義' 名 形參 ['->' 測試] ':' [註釋類型] 函數體套

形參: '(' [類型參單列] ')'

實參們 : 實參 (',' [註釋類型] 實參)*
實參 : 定義測函參 ['=' 測試]
參數字典 : '**' 定義測函參 [','] [註釋類型]
參們 : '*' [定義測函參]

僅鍵參數字典 : (',' [註釋類型] 實參)* (註釋類型 | [',' [註釋類型] [參數字典]])
實參僅鍵參數字典 : 參們 僅鍵參數字典 | 參數字典
位置鍵字實參僅鍵參數字典 : 實參們 ( 註釋類型 | [',' [註釋類型] [實參僅鍵參數字典]])
無僅位置類型參單列  : 位置鍵字實參僅鍵參數字典 | 實參僅鍵參數字典
類型參單列 : (實參們 ',' [註釋類型] '/' [',' [[註釋類型] 無僅位置類型參單列]])|(無僅位置類型參單列)
定義測函參:[':' 測試]
實參們 : 實參 (',' 實參 )*
實參 : 變函參定義 ['=' 測試]
參數字典 : '**' 變函參定義 [',']
參們 : '*' [變函參定義]
僅鍵參數字典 : (',' 實參 )* [',' [參數字典]]
實參僅鍵參數字典 : 參們 僅鍵參數字典 | 參數字典
位置鍵字實參僅鍵參數字典 : 實參們 [',' [實參僅鍵參數字典]]
無僅位置可變參單列 : 位置鍵字實參僅鍵參數字典 | 實參僅鍵參數字典
變參單列 : 實參們 ',' '/' [','[(無僅位置可變參單列)]] | (無僅位置可變參單列)
變函參定義: 名
語句: 簡單語句 | 複合語句
簡單語句: 小語句 (';' 小語句)* [';'] 新行
小語句: (式語句 | 刪語句 | 過語句 | 流語句 |
             導入語句 | 全局語句 | 非本地語句 | 斷定語句)
式語句: 測試列表星式 (標註賦值 | 八月賦值 (產生式|測試列表) |
                     [('=' (產生式|測試列表星式))+ [註釋類型]] )
標註賦值: ':' 測試 ['=' (產生式|測試列表星式)]
測試列表星式: (測試|星式) (',' (測試|星式))* [',']
八月賦值: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' |
            '<<=' | '>>=' | '**=' | '//=')
刪語句: '刪' 式列表
過語句: '過'
流語句: 斷語句 | 下語句 | 中語句 | 拋語句 | 產生語句
斷語句: '斷'
下語句: '下'
中語句: '中' [測試列表星式]
產生語句: 產生式
拋語句: '拋' [測試 ['從' 測試]]
導入語句: 導入名 | 導入從
導入名: '導入' 按名們打點

導入從: ('從' (('.' | '...')* 打點名 | ('.' | '...')+)
              '導入' ('*' | '(' 按名們導入 ')' | 按名們導入))

按名導入:['爲']
按名打點: 打點名 ['爲']
按名們導入: 按名導入 (',' 按名導入)* [',']
按名們打點: 按名打點 (',' 按名打點)*

打點名:('.')*
全局語句: '全局'(',')*
非本地語句: '非本地'(',')*
斷定語句: '斷定' 測試 [',' 測試]

複合語句: 如語句 | 當語句 | 爲語句 | 試語句 | 帶語句 | 函數定義 | 定義類 | 修飾 | 異步語句
異步語句: 異步 (函數定義 | 帶語句 | 爲語句)
如語句: '如' 測試命名式 ':'('異如' 測試命名式 ':')* ['異' ':']
當語句: '當' 測試命名式 ':'['異' ':']
爲語句: '對' 式列表 '在' 測試列表 ':' [註釋類型]['異' ':']
試語句: ('試' ':'((異常語句 ':')+
            ['異' ':']
            ['最終' ':'] |
           '最終' ':'))

帶語句: '帶' 帶項 (',' 帶項)*  ':' [註釋類型] 套
帶項: 測試 ['爲']

異常語句: '異常' [測試 ['爲']]: 簡單語句 | 新行 縮進 語句+ 去縮進

測試命名式: 測試 [':=' 測試]
測試: 或測試 ['如' 或測試 '異' 測試] | λ定義
測試無條件: 或測試 | λ未定義條件
λ定義: 'λ' [變參單列] ':' 測試
λ未定義條件: 'λ' [變參單列] ':' 測試無條件
或測試: 和測試 ('或' 和測試)*
和測試: 非測試 ('和' 非測試)*
非測試: '不' 非測試 | 比較
比較:(比較操作 式)*
比較操作: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'在'|'不在'|'是'|'不是'
星式: '*' 式
式: 異或式 ('|' 異或式)*
異或式: 和式 ('^' 和式)*
和式: 轉移式 ('&' 轉移式)*
轉移式: 數學式 (('<<'|'>>') 數學式)*
數學式:(('+'|'-'))*: 因子 (('*'|'@'|'/'|'%'|'//') 因子)*
因子: ('+'|'-'|'~') 因子 | 冪
冪: 原子式 ['**' 因子]
原子式: [等待] 原子 拖車*
原子: ('(' [產生式|測試列表比較] ')' |
       '[' [測試列表比較] ']' |
       '{' [字典或集製造器] '}' || 數字 |+ | '...' | '無' | '真' | '假')
測試列表比較: (測試命名式|星式) ( 比較對 | (',' (測試命名式|星式))* [','] )
拖車: '(' [參數列表] ')' | '[' 下標列表 ']' | '.' 名
下標列表: 下標 (',' 下標)* [',']
下標: 測試 | [測試] ':' [測試] [切片操作]
切片操作: ':' [測試]
式列表: (|星式) (',' (|星式))* [',']
測試列表: 測試 (',' 測試)* [',']
字典或集製造器: ( ((測試 ':' 測試 | '**')
                   (比較對 | (',' (測試 ':' 測試 | '**'))* [','])) |
                  ((測試 | 星式)
                   (比較對 | (',' (測試 | 星式))* [','])) )

定義類: '類'['(' [參數列表] ')'] ':' 套

參數列表: 實參 (',' 實參)*  [',']

實參: ( 測試 [比較對] |
            測試 ':=' 測試 |
            測試 '=' 測試 |
            '**' 測試 |
            '*' 測試 )

比較步: 比較對 | 比較如
同步比較對: '對' 式列表 '在' 或測試 [比較步]
比較對: [異步] 同步比較對
比較如: '如' 測試無條件 [比較步]

編碼聲明: 名

產生式: '產生' [產生參]
產生參: '從' 測試 | 測試列表星式

函數體套: 簡單語句 | 新行 [註釋類型 新行] 縮進 語句+ 去縮進

輸入類型函數: 函數類型 新行* 尾標記
函數類型: '(' [類型列表] ')' '->' 測試

類型列表: (測試 (',' 測試)* [','
       ['*' [測試] (',' 測試)* [',' '**' 測試] | '**' 測試]]
     |  '*' [測試] (',' 測試)* [',' '**' 測試] | '**' 測試)

上面是語法.
1,可以不要令牌,直接用來解析,感覺令牌是多此一舉.
2,上面的點類型不僅僅是可無,加點,乘點,還有叫一點.一點就是默認的括號,必須有的一項.
3,節點分開表示.項中有個節點*,節點有向量<項>.兩個交叉引用.交叉引用必然出現循環,寫成員函數時,就要先在構中聲明,然後在節點的實現後面單獨再實現.
4,的構造函數中有兩種.一種是表示控制符如(,一種是本身符如'('.
5.型串與表示,兩種都要有.
6,節點的表示就是項應該有一點,不然會表示出錯.
7,項::表示寫在節點類下面,不然循環引用.要出問題.
8,關鍵字多符,關鍵字用"擴着.
9,一定要打印層,這個就像解析的,一定要隨時關注,看哪裏出錯了.用型串.
10,解析單引時,忘記了單引號間的關鍵字.
11,注意右移時,反過來要左移,要配對.
12,歸約時,將常用操作聚集在一個函數.這就是核心函數.然後,在周圍打印.這樣不出錯.
有兩種清理.從幾清理清理後幾,根據情況用,
13,解析或號括號,要逆找,不然壓的順序不對,解析或號時只一個項,就不用歸約成節點了.有不有或號.用一個向量<極>來表示,不然要逆向來找,麻煩.
14,解析括號時,)]有兩個作用,一是歸約至上個|號,二是歸約本次括號.
15,冒號)]一樣,這樣,每次都直接可見是否有或號.
16,一條規則可以換行,只是不能連續換行,連續換行認爲是下一條,且換行後最開始必須是空格.
17,解析各種符時,自身最後都右()一把.不要放在最後來一個右(),不然,要搞混淆.
18,歸約或號後,記得把自身的或號壓進去,不然就錯了.
19,最後面尾時,把最前的冒號當作括號消滅了.
20,兩種搞混淆了,就要出錯,用成員函數來判定.逆找時要小心.
21,規則名,有重複的地方,要去掉重複.
22,最後一步的解析.還要搞.
23,爲了簡寫,只一點時可以不輸入括號.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章