【问题标题】:Treetop parser : how to handle spaces?树顶解析器:如何处理空格?
【发布时间】:2018-03-18 16:07:19
【问题描述】:

大家早上好,

我目前正在尝试描述一些基本的 Ruby 语法,但我现在遇到了解析空间问题? 我可以处理 x = 1 + 1,
但无法解析 x=1+1,
如何解析空间?
我尝试在每个终端后添加足够的空间。 但它无法解析,给一个零..... 我该如何解决? 非常感谢,祝您有愉快的一天。

grammar Test rule main s assign end rule assign name:[a-z]+ s '=' s expression s { def to_ast Assign.new(name.text_value.to_sym, expression.to_ast) end } end rule expression add end rule add left:brackets s '+' s right:add s { def to_ast Add.new(left.to_ast, right.to_ast) end } / minus end rule minus left:brackets s '-' s right:minus s { def to_ast Minus.new(left.to_ast, right.to_ast) end } / brackets end rule brackets '(' s expression ')' s { def to_ast expression.to_ast end } / term end rule term number / variable end rule number [0-9]+ s { def to_ast Number.new(text_value.to_i) end } end rule variable [a-z]+ s { def to_ast Variable.new(text_value.to_sym) end } end rule newline s "\n"+ s end rule s [ \t]* end end

此代码有效 问题解决了!!!

【问题讨论】:

    标签: ruby parsing treetop


    【解决方案1】:

    定义空间规则是不够的,你必须在任何可能有空间的地方使用它。因为这种情况经常发生,所以我通常使用较短的规则名称 S 来表示必填空格,而小写版本的 s 则表示可选空格。

    然后,作为一个原则,我首先在我的顶级规则中跳过可选空格,然后在每个可以跟随空格的终端之后再次跳过。这里的终端是字符串、字符集等。所以在assign 的开头,以及variablebooleannumber 上的{} 块之前,以及你的'='、'-' 和'+' 文字,添加对规则 s 的调用以跳过任何空格。

    这项政策对我很有效。最好有一个空间最小的测试用例和另一个空间最大的用例(在所有可能的地方)。

    【讨论】:

    • 我在每个终端后都添加了足够的空间,但它显示为零............T_T
    • 你没有按照我说的去做。您不需要在每条规则的开头使用space,或者在调用像expression 这样的规则后以跳过空格结尾 - 开始时唯一需要它的规则是main。但是您仍然失败,因为您的 ' + ' 和类似的文字中有空间。删除那些空格。您还必须将![a-z] 直接放在truefalse 之后;之后跳过空格。
    • 我的声望不到15,所以不能投票。我试过很多次了。可惜o(╥﹏╥)o。当我有足够的声誉时,我会投票。真的谢谢你!
    猜你喜欢
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多