我正在使用treetop gem在ruby中编写一个非常简单的小型lisp解析器,以便对其进行实验。但是,它并没有真正解决我想要的方式,文档很差,所以很难理解我做错了什么。目前,语法既可以匹配符号也可以匹配布尔值,但不能匹配数字。但是,当我在原子规则中切换顺序时,例如bool / number / symbol,它仍然匹配前两个,但不匹配最后一个。树梢宝石中是否存在限制,这意味着规则中只能有两个选项?此外,像“(3)”这样的东西仍然无法解析。
我的语法如下:
grammar Lisp
rule expression
atom / list
end
rule atom
symbol / bool / number
end
rule number
[0-9]*
end
rule bool
'T' / 'F'
end
rule symbol
[a-zA-Z]*
end
rule list
'(' expression* ')'
end
end
我正在测试它,因为他们在教程中显示了:
parser = LispParser.new
if parser.parse('T')
puts "Success"
else
puts "Fail"
end
答案 0 :(得分:1)
您定义规则的方式number
和symbol
它们始终匹配(因为*
表示“零或更多”,您总能找到零的东西)。这意味着如果您尝试解析“42”,解析器首先会成功地将规则symbol
与开头的空字符串匹配,然后不再需要输入。
要解决此问题,只需将*
替换为+
。