树顶解析器:如何处理空间?

时间:2017-10-06 19:29:26

标签: ruby parsing treetop

大家早上好,

我目前正在尝试描述一些基本的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

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

1 个答案:

答案 0 :(得分:2)

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

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

这项政策对我很有用。拥有一个具有最小空间的测试用例和另一个具有最大空间的情况(在所有可能的位置)是一个好主意。