如何解决使用害虫解析器为变量构建语法
使用害虫解析器我试图构建一个可以识别变量名称的语法,但我无法让变量以下一个空格/非字母字符结尾。我尝试使用...
var_name = {!reserved ~ ASCII_ALPHA+}
非常适合单字母变量
var_name = {!reserved ~ ASCII_ALPHA+}
但这在我执行 x := 1 时包含一个空格,我的解析器将 var_name 视为“x”。即使我对此没有意见,它也不适用于解析较大的表达式 while true do { if a < b then b := b - a else a := a - b }
=> parse error
var_name = {!reserved ~ ASCII_ALPHA | ASCII_ALPHA+}
的反应类似于单字符选项。
我也尝试使用 'a'..'z'、字母数字和其他选项,但没有改变。我可能遗漏了 book 中的某些内容,但我似乎找不到任何有用的东西。
附加信息:
- 在害虫网站的底部,有一个语法测试区 https://pest.rs/。
- reserved 是保留名称的列表,例如 for、while 和 int
- 重申目标是让我的解析器识别变量名称,'a'..'z' 和 'A'..'Z'
谢谢,感谢您的帮助
解决方法
我想出了答案。
var_name = @{!reserved ~ ASCII_ALPHA ~ ASCII_ALPHANUMERIC*}
来自书中:'两种原子规则都防止了隐式空格:在原子规则中,波浪号 ~ 表示“紧随其后”'
我之前尝试过这个并被卡住了,不过这很简单。
@ 表示没有空格,!reserved 将保留字保留在变量之外。 ASCII_ALPHA 变量以字母开头,后面可以有 0 个或多个字母数字字符。
希望这能帮助其他陷入困境的人。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。