使用gratr生成Agda解析器
1. 正则表达式运算符在语法中的应用
gratr支持在产生式的右侧使用特定的额外运算符,即正则表达式运算符。这些运算符可以应用于单个符号(输入符号或非终结符),也可以应用于用括号括起来的符号组和运算符使用。以下是这些额外运算符及其含义:
| 运算符使用 | 含义 |
| — | — |
| N* | N的零个或多个副本 |
| N+ | N的一个或多个副本 |
| N? | N的零个或一个副本(即N是可选的) |
| N | M | 要么是N,要么是M |
使用这些运算符,可以轻松修改示例语法,使数字不仅仅是 ‘0’、‘1’ 和 ‘2’。虽然也可以通过为 num 添加额外的产生式来实现这一点,但使用正则表达式运算符更加方便。实际上,通过引入额外的非终结符,不难消除正则表达式运算符的使用。例如,如果有 N? ,可以用一个新的非终结符 M 替换它,并添加以下新的产生式:
M -> N .
M -> .
这表明 M 可以是 N 或为空,这正是 N? 的含义。更新后的语法如图6.5所示,该语法包含在gratr的顶级目录下的 grammars/expression/prefix.gr 文件中。
目前,最好将正则表达式运算符的使用限制在词法产生式中。因为对于
超级会员免费看
订阅专栏 解锁全文
14

被折叠的 条评论
为什么被折叠?



