1

我正在用树顶 gem 用 ruby​​ 编写一个小的、非常简单的 lisp 解析器,只是为了试验它。但是,它并没有真正解决我想要的结果,而且文档很差,所以很难理解我做错了什么。目前,语法可以匹配符号和布尔值,但不能匹配数字。但是,当我在 atom 规则中切换顺序时,例如切换到 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
4

1 回答 1

1

您定义规则的方式number并且symbol它们始终匹配(因为*意味着“零或更多”并且您总是可以找到零)。这意味着,如果您尝试解析“42”,解析器首先成功地将规则symbol与开头的空字符串进行匹配,然后不再期待进一步的输入。

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

于 2010-09-17T03:20:08.717 回答