单输入: 新行 | 简单语句 | 复合语句 新行
文件输入: (新行 | 语句)* 尾标记
求值输入: 测试列表 新行* 尾标记
修饰器: '@' 打点名 [ '(' [参数列表] ')' ] 新行
装饰器: 修饰器+
修饰: 装饰器 (定义类 | 函数定义 | 异步函数定义)
异步函数定义: 异步 函数定义
函数定义: '定义' 名 形参 ['->' 测试] ':' [注释类型] 函数体套
形参: '(' [类型参单列] ')'
实参们 : 实参 (',' [注释类型] 实参)*
实参 : 定义测函参 ['=' 测试]
参数字典 : '**' 定义测函参 [','] [注释类型]
参们 : '*' [定义测函参]
仅键参数字典 : (',' [注释类型] 实参)* (注释类型 | [',' [注释类型] [参数字典]])
实参仅键参数字典 : 参们 仅键参数字典 | 参数字典
位置键字实参仅键参数字典 : 实参们 ( 注释类型 | [',' [注释类型] [实参仅键参数字典]])
无仅位置类型参单列 : 位置键字实参仅键参数字典 | 实参仅键参数字典
类型参单列 : (实参们 ',' [注释类型] '/' [',' [[注释类型] 无仅位置类型参单列]])|(无仅位置类型参单列)
定义测函参: 名 [':' 测试]
实参们 : 实参 (',' 实参 )*
实参 : 变函参定义 ['=' 测试]
参数字典 : '**' 变函参定义 [',']
参们 : '*' [变函参定义]
仅键参数字典 : (',' 实参 )* [',' [参数字典]]
实参仅键参数字典 : 参们 仅键参数字典 | 参数字典
位置键字实参仅键参数字典 : 实参们 [',' [实参仅键参数字典]]
无仅位置可变参单列 : 位置键字实参仅键参数字典 | 实参仅键参数字典
变参单列 : 实参们 ',' '/' [','[(无仅位置可变参单列)]] | (无仅位置可变参单列)
变函参定义: 名
语句: 简单语句 | 复合语句
简单语句: 小语句 (';' 小语句)* [';'] 新行
小语句: (式语句 | 删语句 | 过语句 | 流语句 |
导入语句 | 全局语句 | 非本地语句 | 断定语句)
式语句: 测试列表星式 (标注赋值 | 八月赋值 (产生式|测试列表) |
[('=' (产生式|测试列表星式))+ [注释类型]] )
标注赋值: ':' 测试 ['=' (产生式|测试列表星式)]
测试列表星式: (测试|星式) (',' (测试|星式))* [',']
八月赋值: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' |
'<<=' | '>>=' | '**=' | '//=')
删语句: '删' 式列表
过语句: '过'
流语句: 断语句 | 下语句 | 中语句 | 抛语句 | 产生语句
断语句: '断'
下语句: '下'
中语句: '中' [测试列表星式]
产生语句: 产生式
抛语句: '抛' [测试 ['从' 测试]]
导入语句: 导入名 | 导入从
导入名: '导入' 按名们打点
导入从: ('从' (('.' | '...')* 打点名 | ('.' | '...')+)
'导入' ('*' | '(' 按名们导入 ')' | 按名们导入))
按名导入: 名 ['为' 名]
按名打点: 打点名 ['为' 名]
按名们导入: 按名导入 (',' 按名导入)* [',']
按名们打点: 按名打点 (',' 按名打点)*
打点名: 名 ('.' 名)*
全局语句: '全局' 名 (',' 名)*
非本地语句: '非本地' 名 (',' 名)*
断定语句: '断定' 测试 [',' 测试]
复合语句: 如语句 | 当语句 | 为语句 | 试语句 | 带语句 | 函数定义 | 定义类 | 修饰 | 异步语句
异步语句: 异步 (函数定义 | 带语句 | 为语句)
如语句: '如' 测试命名式 ':' 套 ('异如' 测试命名式 ':' 套)* ['异' ':' 套]
当语句: '当' 测试命名式 ':' 套 ['异' ':' 套]
为语句: '对' 式列表 '在' 测试列表 ':' [注释类型] 套 ['异' ':' 套]
试语句: ('试' ':' 套
((异常语句 ':' 套)+
['异' ':' 套]
['最终' ':' 套] |
'最终' ':' 套))
带语句: '带' 带项 (',' 带项)* ':' [注释类型] 套
带项: 测试 ['为' 式]
异常语句: '异常' [测试 ['为' 名]]
套: 简单语句 | 新行 缩进 语句+ 去缩进
测试命名式: 测试 [':=' 测试]
测试: 或测试 ['如' 或测试 '异' 测试] | λ定义
测试无条件: 或测试 | λ未定义条件
λ定义: 'λ' [变参单列] ':' 测试
λ未定义条件: 'λ' [变参单列] ':' 测试无条件
或测试: 和测试 ('或' 和测试)*
和测试: 非测试 ('和' 非测试)*
非测试: '不' 非测试 | 比较
比较: 式 (比较操作 式)*
比较操作: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'在'|'不在'|'是'|'不是'
星式: '*' 式
式: 异或式 ('|' 异或式)*
异或式: 和式 ('^' 和式)*
和式: 转移式 ('&' 转移式)*
转移式: 数学式 (('<<'|'>>') 数学式)*
数学式: 项 (('+'|'-') 项)*
项: 因子 (('*'|'@'|'/'|'%'|'//') 因子)*
因子: ('+'|'-'|'~') 因子 | 幂
幂: 原子式 ['**' 因子]
原子式: [等待] 原子 拖车*
原子: ('(' [产生式|测试列表比较] ')' |
'[' [测试列表比较] ']' |
'{' [字典或集制造器] '}' |
名 | 数字 | 串+ | '...' | '无' | '真' | '假')
测试列表比较: (测试命名式|星式) ( 比较对 | (',' (测试命名式|星式))* [','] )
拖车: '(' [参数列表] ')' | '[' 下标列表 ']' | '.' 名
下标列表: 下标 (',' 下标)* [',']
下标: 测试 | [测试] ':' [测试] [切片操作]
切片操作: ':' [测试]
式列表: (式|星式) (',' (式|星式))* [',']
测试列表: 测试 (',' 测试)* [',']
字典或集制造器: ( ((测试 ':' 测试 | '**' 式)
(比较对 | (',' (测试 ':' 测试 | '**' 式))* [','])) |
((测试 | 星式)
(比较对 | (',' (测试 | 星式))* [','])) )
定义类: '类' 名 ['(' [参数列表] ')'] ':' 套
参数列表: 实参 (',' 实参)* [',']
实参: ( 测试 [比较对] |
测试 ':=' 测试 |
测试 '=' 测试 |
'**' 测试 |
'*' 测试 )
比较步: 比较对 | 比较如
同步比较对: '对' 式列表 '在' 或测试 [比较步]
比较对: [异步] 同步比较对
比较如: '如' 测试无条件 [比较步]
编码声明: 名
产生式: '产生' [产生参]
产生参: '从' 测试 | 测试列表星式
函数体套: 简单语句 | 新行 [注释类型 新行] 缩进 语句+ 去缩进
输入类型函数: 函数类型 新行* 尾标记
函数类型: '(' [类型列表] ')' '->' 测试
类型列表: (测试 (',' 测试)* [','
['*' [测试] (',' 测试)* [',' '**' 测试] | '**' 测试]]
| '*' [测试] (',' 测试)* [',' '**' 测试] | '**' 测试)
上面是语法.
1,可以不要令牌
,直接用项
来解析,感觉令牌
是多此一举.
2,上面的点类型
不仅仅是可无,加点,乘点
,还有叫一点
.一点就是默认的括号
,必须有的一项
.
3,项
和节点
分开表示.项中有个节点*
,节点有向量<项>
.两个交叉引用.交叉引用
必然出现循环,写成员函数时,就要先在构中声明,然后在节点的实现后面单独再实现
.
4,项
的构造函数中有两种符
.一种是表示控制符如(
,一种是本身符如'('
.
5.型串与表示,两种都要有.
6,节点的表示就是项应该有一点
,不然会表示出错.
7,项::表示
写在节点类
下面,不然循环引用
.要出问题.
8,关键字
与多符
,关键字用"
扩着.
9,一定要打印层
,这个就像解析的栈
,一定要随时关注,看哪里出错了.用型串
.
10,解析单引
时,忘记了单引号间的关键字
.
11,注意右移时,反过来要左移,要配对.
12,归约
时,将常用操作聚集在一个函数.这就是核心函数.然后,在周围打印
.这样不出错.
有两种清理.从几清理
与清理后几
,根据情况用,
13,解析或号
与括号
,要逆找
,不然压的顺序不对
,解析或号
时只一个项,就不用归约成节点
了.有不有或号
.用一个向量<极>
来表示,不然要逆向来找,麻烦.
14,解析括号
时,)]
有两个作用,一是归约至上个|号
,二是归约本次括号
.
15,冒号
与)]
一样,这样,每次都直接可见是否有或号
.
16,一条规则可以换行,只是不能连续换行,连续换行认为是下一条,且换行后最开始必须是空格
.
17,解析各种符时,自身最后都右()
一把.不要放在最后来一个右()
,不然,要搞混淆.
18,归约或号
后,记得把自身的或号
压进去,不然就错了.
19,最后面尾时,把最前的冒号当作括号消灭了.
20,两种符
搞混淆了,就要出错,用成员函数
来判定.逆找时要小心.
21,规则名,有重复的地方,要去掉重复
.
22,最后一步的解析.还要搞.
23,为了简写
,只一点时可以不输入括号
.