Treetop解析器:如何处理空格?

问题描述:

大家早上好,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 
 

此代码的工作 问题解决了!!!!

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

然后,作为一个原则,我首先跳过可选空间,然后在每个可以跟着空格的终端之后再跳过可选空间。这里的终端是字符串,字符集等。因此,在assign的开头,以及variable,boolean,number的{}块之前,以及在'=',' - '和'+'文字后加上一个呼叫规则s跳过任何空格。

此政策适用于我。有一个最小空间的测试用例和另一个具有最大空间(所有可能的地方)的情况是一个好主意。

+0

我已经在每个终端后添加足够的空间,但它显示无.......... T_T – DoubleMay

+0

你还没有做我说的。在每个规则的开始处,或者在调用像'expression'这样以跳过空格结束的规则之后,你不需要'space',在开始时需要它的唯一规则是'main'。但是你仍然失败,因为你的''+''和类似的文字中有空格。删除这些空格。你还必须在'true'和'false'之后直接放置'![a-z]';之后跳过空格。 – cliffordheath

+0

神圣的耶稣,它的作品!!!!!!!!!非常感谢!!!!!!!!!!!!! – DoubleMay