对于以下树顶语法,在解析“3/14/01”(通过t = Parser.parse('3/14/01')
irb)时,我得到一个“TypeError:错误的参数类型类(预期的模块)”。
grammar SimpleDate
rule dateMDY
whitespace? month_part ( '/' / '-') day_part ( ('/' / '-') year_part)? whitespace? <DateMDY>
end
rule month_part
( ( '1' [0-2] ) / ( '0'? [1-9] ) ) <MonthLiteral>
end
rule day_part
( ( [12] [0-9] ) / ( '3' [0-1] ) / ( '0'? [1-9] ) ) <DayLiteral>
end
rule year_part
( ( '1' '9' ) / ( '2' [01] ) )? [0-9] [0-9] <YearLiteral> # 1900 through 2199 (4 digit)
end
rule whitespace
[\s]+
end
end
首先,如果我注释掉<MonthLiteral>
和<DayLiteral>
类引用,一切都很好。注释掉<DateMDY>
,但保留那些 Literal 对象,也会发出错误。注释掉<YearLiteral>
似乎无关紧要(不管它会起作用还是不起作用)——这似乎表明因为前两个是非终端的,我不能为它们生成元素。
很明显,对于 Ruby(或树顶)如何实例化这些类或关于 AST 生成可以解释会发生什么,我并不欣赏。你能解释或指出一些可以帮助我理解为什么<MonthLiteral>
或<DayLiteral>
不能生成对象的东西吗?
其次,这可能是一座过分的桥梁,但我真正喜欢的是获得一个DateMDY
具有三个属性的对象——月、日和年——这样我就可以很容易地从中Time
的方法生成一个 Ruby 对象,但是现在我会满足于将组成部分作为对象来生产。to_time
DateMDY
所以我尝试<DateMDY>
作为对象离开并注释掉对<MonthLiteral>
,<DayLiteral>
和. 的引用<YearLiteral>
。我看到从.parse
(t
在我的原始示例中) 返回的结果 AST 对象有两个公共方法——但是当我调用这些方法时:day_part
,:month_part
这些方法似乎是 nil (比如puts t.day_part
) 并且没有:year_part
方法,所以这似乎没有帮助我出去。
是否有可能以某种方式DateMDY
最终访问其组成部分?
仅供参考,Parser
我使用的代码本身是树顶教程中非常标准的东西node_extensions.rb
,定义对象类的代码也很简单,但如果您需要查看这些代码,我也可以发布它们。
谢谢!理查德