單輸入: 新行 | 簡單語句 | 複合語句 新行
文件輸入: (新行 | 語句)* 尾標記
求值輸入: 測試列表 新行* 尾標記
修飾器: '@' 打點名 [ '(' [參數列表] ')' ] 新行
裝飾器: 修飾器+
修飾: 裝飾器 (定義類 | 函數定義 | 異步函數定義)
異步函數定義: 異步 函數定義
函數定義: '定義' 名 形參 ['->' 測試] ':' [註釋類型] 函數體套
形參: '(' [類型參單列] ')'
實參們 : 實參 (',' [註釋類型] 實參)*
實參 : 定義測函參 ['=' 測試]
參數字典 : '**' 定義測函參 [','] [註釋類型]
參們 : '*' [定義測函參]
僅鍵參數字典 : (',' [註釋類型] 實參)* (註釋類型 | [',' [註釋類型] [參數字典]])
實參僅鍵參數字典 : 參們 僅鍵參數字典 | 參數字典
位置鍵字實參僅鍵參數字典 : 實參們 ( 註釋類型 | [',' [註釋類型] [實參僅鍵參數字典]])
無僅位置類型參單列 : 位置鍵字實參僅鍵參數字典 | 實參僅鍵參數字典
類型參單列 : (實參們 ',' [註釋類型] '/' [',' [[註釋類型] 無僅位置類型參單列]])|(無僅位置類型參單列)
定義測函參: 名 [':' 測試]
實參們 : 實參 (',' 實參 )*
實參 : 變函參定義 ['=' 測試]
參數字典 : '**' 變函參定義 [',']
參們 : '*' [變函參定義]
僅鍵參數字典 : (',' 實參 )* [',' [參數字典]]
實參僅鍵參數字典 : 參們 僅鍵參數字典 | 參數字典
位置鍵字實參僅鍵參數字典 : 實參們 [',' [實參僅鍵參數字典]]
無僅位置可變參單列 : 位置鍵字實參僅鍵參數字典 | 實參僅鍵參數字典
變參單列 : 實參們 ',' '/' [','[(無僅位置可變參單列)]] | (無僅位置可變參單列)
變函參定義: 名
語句: 簡單語句 | 複合語句
簡單語句: 小語句 (';' 小語句)* [';'] 新行
小語句: (式語句 | 刪語句 | 過語句 | 流語句 |
導入語句 | 全局語句 | 非本地語句 | 斷定語句)
式語句: 測試列表星式 (標註賦值 | 八月賦值 (產生式|測試列表) |
[('=' (產生式|測試列表星式))+ [註釋類型]] )
標註賦值: ':' 測試 ['=' (產生式|測試列表星式)]
測試列表星式: (測試|星式) (',' (測試|星式))* [',']
八月賦值: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' |
'<<=' | '>>=' | '**=' | '//=')
刪語句: '刪' 式列表
過語句: '過'
流語句: 斷語句 | 下語句 | 中語句 | 拋語句 | 產生語句
斷語句: '斷'
下語句: '下'
中語句: '中' [測試列表星式]
產生語句: 產生式
拋語句: '拋' [測試 ['從' 測試]]
導入語句: 導入名 | 導入從
導入名: '導入' 按名們打點
導入從: ('從' (('.' | '...')* 打點名 | ('.' | '...')+)
'導入' ('*' | '(' 按名們導入 ')' | 按名們導入))
按名導入: 名 ['爲' 名]
按名打點: 打點名 ['爲' 名]
按名們導入: 按名導入 (',' 按名導入)* [',']
按名們打點: 按名打點 (',' 按名打點)*
打點名: 名 ('.' 名)*
全局語句: '全局' 名 (',' 名)*
非本地語句: '非本地' 名 (',' 名)*
斷定語句: '斷定' 測試 [',' 測試]
複合語句: 如語句 | 當語句 | 爲語句 | 試語句 | 帶語句 | 函數定義 | 定義類 | 修飾 | 異步語句
異步語句: 異步 (函數定義 | 帶語句 | 爲語句)
如語句: '如' 測試命名式 ':' 套 ('異如' 測試命名式 ':' 套)* ['異' ':' 套]
當語句: '當' 測試命名式 ':' 套 ['異' ':' 套]
爲語句: '對' 式列表 '在' 測試列表 ':' [註釋類型] 套 ['異' ':' 套]
試語句: ('試' ':' 套
((異常語句 ':' 套)+
['異' ':' 套]
['最終' ':' 套] |
'最終' ':' 套))
帶語句: '帶' 帶項 (',' 帶項)* ':' [註釋類型] 套
帶項: 測試 ['爲' 式]
異常語句: '異常' [測試 ['爲' 名]]
套: 簡單語句 | 新行 縮進 語句+ 去縮進
測試命名式: 測試 [':=' 測試]
測試: 或測試 ['如' 或測試 '異' 測試] | λ定義
測試無條件: 或測試 | λ未定義條件
λ定義: 'λ' [變參單列] ':' 測試
λ未定義條件: 'λ' [變參單列] ':' 測試無條件
或測試: 和測試 ('或' 和測試)*
和測試: 非測試 ('和' 非測試)*
非測試: '不' 非測試 | 比較
比較: 式 (比較操作 式)*
比較操作: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'在'|'不在'|'是'|'不是'
星式: '*' 式
式: 異或式 ('|' 異或式)*
異或式: 和式 ('^' 和式)*
和式: 轉移式 ('&' 轉移式)*
轉移式: 數學式 (('<<'|'>>') 數學式)*
數學式: 項 (('+'|'-') 項)*
項: 因子 (('*'|'@'|'/'|'%'|'//') 因子)*
因子: ('+'|'-'|'~') 因子 | 冪
冪: 原子式 ['**' 因子]
原子式: [等待] 原子 拖車*
原子: ('(' [產生式|測試列表比較] ')' |
'[' [測試列表比較] ']' |
'{' [字典或集製造器] '}' |
名 | 數字 | 串+ | '...' | '無' | '真' | '假')
測試列表比較: (測試命名式|星式) ( 比較對 | (',' (測試命名式|星式))* [','] )
拖車: '(' [參數列表] ')' | '[' 下標列表 ']' | '.' 名
下標列表: 下標 (',' 下標)* [',']
下標: 測試 | [測試] ':' [測試] [切片操作]
切片操作: ':' [測試]
式列表: (式|星式) (',' (式|星式))* [',']
測試列表: 測試 (',' 測試)* [',']
字典或集製造器: ( ((測試 ':' 測試 | '**' 式)
(比較對 | (',' (測試 ':' 測試 | '**' 式))* [','])) |
((測試 | 星式)
(比較對 | (',' (測試 | 星式))* [','])) )
定義類: '類' 名 ['(' [參數列表] ')'] ':' 套
參數列表: 實參 (',' 實參)* [',']
實參: ( 測試 [比較對] |
測試 ':=' 測試 |
測試 '=' 測試 |
'**' 測試 |
'*' 測試 )
比較步: 比較對 | 比較如
同步比較對: '對' 式列表 '在' 或測試 [比較步]
比較對: [異步] 同步比較對
比較如: '如' 測試無條件 [比較步]
編碼聲明: 名
產生式: '產生' [產生參]
產生參: '從' 測試 | 測試列表星式
函數體套: 簡單語句 | 新行 [註釋類型 新行] 縮進 語句+ 去縮進
輸入類型函數: 函數類型 新行* 尾標記
函數類型: '(' [類型列表] ')' '->' 測試
類型列表: (測試 (',' 測試)* [','
['*' [測試] (',' 測試)* [',' '**' 測試] | '**' 測試]]
| '*' [測試] (',' 測試)* [',' '**' 測試] | '**' 測試)
上面是語法.
1,可以不要令牌
,直接用項
來解析,感覺令牌
是多此一舉.
2,上面的點類型
不僅僅是可無,加點,乘點
,還有叫一點
.一點就是默認的括號
,必須有的一項
.
3,項
和節點
分開表示.項中有個節點*
,節點有向量<項>
.兩個交叉引用.交叉引用
必然出現循環,寫成員函數時,就要先在構中聲明,然後在節點的實現後面單獨再實現
.
4,項
的構造函數中有兩種符
.一種是表示控制符如(
,一種是本身符如'('
.
5.型串與表示,兩種都要有.
6,節點的表示就是項應該有一點
,不然會表示出錯.
7,項::表示
寫在節點類
下面,不然循環引用
.要出問題.
8,關鍵字
與多符
,關鍵字用"
擴着.
9,一定要打印層
,這個就像解析的棧
,一定要隨時關注,看哪裏出錯了.用型串
.
10,解析單引
時,忘記了單引號間的關鍵字
.
11,注意右移時,反過來要左移,要配對.
12,歸約
時,將常用操作聚集在一個函數.這就是核心函數.然後,在周圍打印
.這樣不出錯.
有兩種清理.從幾清理
與清理後幾
,根據情況用,
13,解析或號
與括號
,要逆找
,不然壓的順序不對
,解析或號
時只一個項,就不用歸約成節點
了.有不有或號
.用一個向量<極>
來表示,不然要逆向來找,麻煩.
14,解析括號
時,)]
有兩個作用,一是歸約至上個|號
,二是歸約本次括號
.
15,冒號
與)]
一樣,這樣,每次都直接可見是否有或號
.
16,一條規則可以換行,只是不能連續換行,連續換行認爲是下一條,且換行後最開始必須是空格
.
17,解析各種符時,自身最後都右()
一把.不要放在最後來一個右()
,不然,要搞混淆.
18,歸約或號
後,記得把自身的或號
壓進去,不然就錯了.
19,最後面尾時,把最前的冒號當作括號消滅了.
20,兩種符
搞混淆了,就要出錯,用成員函數
來判定.逆找時要小心.
21,規則名,有重複的地方,要去掉重複
.
22,最後一步的解析.還要搞.
23,爲了簡寫
,只一點時可以不輸入括號
.