【发布时间】:2015-07-14 13:02:50
【问题描述】:
对于以下树顶语法,在解析 '3/14/01' 时(通过 irb 中的 t = Parser.parse('3/14/01')),我收到“TypeError: wrong argument type Class (expected Module)”。
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对象——月、日和年——这样我就可以很容易地从一个DateMDY 中的方法 to_time,但现在我只满足于将组成部分作为对象生成。
所以我尝试将<DateMDY> 作为对象并注释掉对<MonthLiteral>、<DayLiteral> 和<YearLiteral> 的引用。我看到从.parse(在我的原始示例中为t)返回的结果AST 对象有两个公共方法——:day_part 和:month_part,但是当我调用它们时它们似乎为零(比如,puts t.day_part ) 并且没有 :year_part 方法,所以这似乎对我没有帮助。
是否有可能以某种方式让DateMDY 最终访问其组成部分?
仅供参考,我使用的 Parser 代码本身是树顶教程中的标准内容,而定义对象类的 node_extensions.rb 也很简单,但如果您需要查看这些内容,我也可以发布这些内容。
谢谢! 理查德
【问题讨论】:
标签: ruby-on-rails ruby parsing treetop