解析py中文语法规则经验教训.

单输入: 新行 | 简单语句 | 复合语句 新行
文件输入: (新行 | 语句)* 尾标记
求值输入: 测试列表 新行* 尾标记

修饰器: '@' 打点名 [ '(' [参数列表] ')' ] 新行
装饰器: 修饰器+
修饰: 装饰器 (定义类 | 函数定义 | 异步函数定义)

异步函数定义: 异步 函数定义
函数定义: '定义' 名 形参 ['->' 测试] ':' [注释类型] 函数体套

形参: '(' [类型参单列] ')'

实参们 : 实参 (',' [注释类型] 实参)*
实参 : 定义测函参 ['=' 测试]
参数字典 : '**' 定义测函参 [','] [注释类型]
参们 : '*' [定义测函参]

仅键参数字典 : (',' [注释类型] 实参)* (注释类型 | [',' [注释类型] [参数字典]])
实参仅键参数字典 : 参们 仅键参数字典 | 参数字典
位置键字实参仅键参数字典 : 实参们 ( 注释类型 | [',' [注释类型] [实参仅键参数字典]])
无仅位置类型参单列  : 位置键字实参仅键参数字典 | 实参仅键参数字典
类型参单列 : (实参们 ',' [注释类型] '/' [',' [[注释类型] 无仅位置类型参单列]])|(无仅位置类型参单列)
定义测函参:[':' 测试]
实参们 : 实参 (',' 实参 )*
实参 : 变函参定义 ['=' 测试]
参数字典 : '**' 变函参定义 [',']
参们 : '*' [变函参定义]
仅键参数字典 : (',' 实参 )* [',' [参数字典]]
实参仅键参数字典 : 参们 仅键参数字典 | 参数字典
位置键字实参仅键参数字典 : 实参们 [',' [实参仅键参数字典]]
无仅位置可变参单列 : 位置键字实参仅键参数字典 | 实参仅键参数字典
变参单列 : 实参们 ',' '/' [','[(无仅位置可变参单列)]] | (无仅位置可变参单列)
变函参定义: 名
语句: 简单语句 | 复合语句
简单语句: 小语句 (';' 小语句)* [';'] 新行
小语句: (式语句 | 删语句 | 过语句 | 流语句 |
             导入语句 | 全局语句 | 非本地语句 | 断定语句)
式语句: 测试列表星式 (标注赋值 | 八月赋值 (产生式|测试列表) |
                     [('=' (产生式|测试列表星式))+ [注释类型]] )
标注赋值: ':' 测试 ['=' (产生式|测试列表星式)]
测试列表星式: (测试|星式) (',' (测试|星式))* [',']
八月赋值: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' |
            '<<=' | '>>=' | '**=' | '//=')
删语句: '删' 式列表
过语句: '过'
流语句: 断语句 | 下语句 | 中语句 | 抛语句 | 产生语句
断语句: '断'
下语句: '下'
中语句: '中' [测试列表星式]
产生语句: 产生式
抛语句: '抛' [测试 ['从' 测试]]
导入语句: 导入名 | 导入从
导入名: '导入' 按名们打点

导入从: ('从' (('.' | '...')* 打点名 | ('.' | '...')+)
              '导入' ('*' | '(' 按名们导入 ')' | 按名们导入))

按名导入:['为']
按名打点: 打点名 ['为']
按名们导入: 按名导入 (',' 按名导入)* [',']
按名们打点: 按名打点 (',' 按名打点)*

打点名:('.')*
全局语句: '全局'(',')*
非本地语句: '非本地'(',')*
断定语句: '断定' 测试 [',' 测试]

复合语句: 如语句 | 当语句 | 为语句 | 试语句 | 带语句 | 函数定义 | 定义类 | 修饰 | 异步语句
异步语句: 异步 (函数定义 | 带语句 | 为语句)
如语句: '如' 测试命名式 ':'('异如' 测试命名式 ':')* ['异' ':']
当语句: '当' 测试命名式 ':'['异' ':']
为语句: '对' 式列表 '在' 测试列表 ':' [注释类型]['异' ':']
试语句: ('试' ':'((异常语句 ':')+
            ['异' ':']
            ['最终' ':'] |
           '最终' ':'))

带语句: '带' 带项 (',' 带项)*  ':' [注释类型] 套
带项: 测试 ['为']

异常语句: '异常' [测试 ['为']]: 简单语句 | 新行 缩进 语句+ 去缩进

测试命名式: 测试 [':=' 测试]
测试: 或测试 ['如' 或测试 '异' 测试] | λ定义
测试无条件: 或测试 | λ未定义条件
λ定义: 'λ' [变参单列] ':' 测试
λ未定义条件: 'λ' [变参单列] ':' 测试无条件
或测试: 和测试 ('或' 和测试)*
和测试: 非测试 ('和' 非测试)*
非测试: '不' 非测试 | 比较
比较:(比较操作 式)*
比较操作: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'在'|'不在'|'是'|'不是'
星式: '*' 式
式: 异或式 ('|' 异或式)*
异或式: 和式 ('^' 和式)*
和式: 转移式 ('&' 转移式)*
转移式: 数学式 (('<<'|'>>') 数学式)*
数学式:(('+'|'-'))*: 因子 (('*'|'@'|'/'|'%'|'//') 因子)*
因子: ('+'|'-'|'~') 因子 | 幂
幂: 原子式 ['**' 因子]
原子式: [等待] 原子 拖车*
原子: ('(' [产生式|测试列表比较] ')' |
       '[' [测试列表比较] ']' |
       '{' [字典或集制造器] '}' || 数字 |+ | '...' | '无' | '真' | '假')
测试列表比较: (测试命名式|星式) ( 比较对 | (',' (测试命名式|星式))* [','] )
拖车: '(' [参数列表] ')' | '[' 下标列表 ']' | '.' 名
下标列表: 下标 (',' 下标)* [',']
下标: 测试 | [测试] ':' [测试] [切片操作]
切片操作: ':' [测试]
式列表: (|星式) (',' (|星式))* [',']
测试列表: 测试 (',' 测试)* [',']
字典或集制造器: ( ((测试 ':' 测试 | '**')
                   (比较对 | (',' (测试 ':' 测试 | '**'))* [','])) |
                  ((测试 | 星式)
                   (比较对 | (',' (测试 | 星式))* [','])) )

定义类: '类'['(' [参数列表] ')'] ':' 套

参数列表: 实参 (',' 实参)*  [',']

实参: ( 测试 [比较对] |
            测试 ':=' 测试 |
            测试 '=' 测试 |
            '**' 测试 |
            '*' 测试 )

比较步: 比较对 | 比较如
同步比较对: '对' 式列表 '在' 或测试 [比较步]
比较对: [异步] 同步比较对
比较如: '如' 测试无条件 [比较步]

编码声明: 名

产生式: '产生' [产生参]
产生参: '从' 测试 | 测试列表星式

函数体套: 简单语句 | 新行 [注释类型 新行] 缩进 语句+ 去缩进

输入类型函数: 函数类型 新行* 尾标记
函数类型: '(' [类型列表] ')' '->' 测试

类型列表: (测试 (',' 测试)* [','
       ['*' [测试] (',' 测试)* [',' '**' 测试] | '**' 测试]]
     |  '*' [测试] (',' 测试)* [',' '**' 测试] | '**' 测试)

上面是语法.
1,可以不要令牌,直接用来解析,感觉令牌是多此一举.
2,上面的点类型不仅仅是可无,加点,乘点,还有叫一点.一点就是默认的括号,必须有的一项.
3,节点分开表示.项中有个节点*,节点有向量<项>.两个交叉引用.交叉引用必然出现循环,写成员函数时,就要先在构中声明,然后在节点的实现后面单独再实现.
4,的构造函数中有两种.一种是表示控制符如(,一种是本身符如'('.
5.型串与表示,两种都要有.
6,节点的表示就是项应该有一点,不然会表示出错.
7,项::表示写在节点类下面,不然循环引用.要出问题.
8,关键字多符,关键字用"扩着.
9,一定要打印层,这个就像解析的,一定要随时关注,看哪里出错了.用型串.
10,解析单引时,忘记了单引号间的关键字.
11,注意右移时,反过来要左移,要配对.
12,归约时,将常用操作聚集在一个函数.这就是核心函数.然后,在周围打印.这样不出错.
有两种清理.从几清理清理后几,根据情况用,
13,解析或号括号,要逆找,不然压的顺序不对,解析或号时只一个项,就不用归约成节点了.有不有或号.用一个向量<极>来表示,不然要逆向来找,麻烦.
14,解析括号时,)]有两个作用,一是归约至上个|号,二是归约本次括号.
15,冒号)]一样,这样,每次都直接可见是否有或号.
16,一条规则可以换行,只是不能连续换行,连续换行认为是下一条,且换行后最开始必须是空格.
17,解析各种符时,自身最后都右()一把.不要放在最后来一个右(),不然,要搞混淆.
18,归约或号后,记得把自身的或号压进去,不然就错了.
19,最后面尾时,把最前的冒号当作括号消灭了.
20,两种搞混淆了,就要出错,用成员函数来判定.逆找时要小心.
21,规则名,有重复的地方,要去掉重复.
22,最后一步的解析.还要搞.
23,为了简写,只一点时可以不输入括号.

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