使用害虫解析器为变量构建语法

问题描述

使用害虫解析器我试图构建一个可以识别变量名称的语法,但我无法让变量以下一个空格/非字母字符结尾。我尝试使用...

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 个或多个字母数字字符。

希望这能帮助其他陷入困境的人。