树梢语法问题,不匹配所有选项

时间:2010-09-17 03:05:25

标签: ruby lisp treetop

我正在使用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

1 个答案:

答案 0 :(得分:1)

您定义规则的方式numbersymbol它们始终匹配(因为*表示“零或更多”,您总能找到零的东西)。这意味着如果您尝试解析“42”,解析器首先会成功地将规则symbol与开头的空字符串匹配,然后不再需要输入。

要解决此问题,只需将*替换为+