树顶解析器:如何处理空格?
Treetop parser : how to handle spaces?
大家早上好,
我目前正在尝试描述一些基本的 Ruby 语法,但我现在受困于解析 space?
我可以处理 x = 1 + 1,
但无法解析 x=1+1,
我如何解析 space?
我已经尝试在每个终端后添加足够的 space 。
但它无法解析,给一个零.....
我该如何解决?
非常感谢,祝你有愉快的一天。
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
此代码有效
问题已解决!!!!
仅仅定义 space 规则是不够的,您必须在可能 space 的任何地方使用它。因为这种情况经常发生,所以我通常使用较短的规则名称 S
来表示强制性的 space,而使用小写的 s
来表示可选的 space.
然后,作为原则,我首先在我的最高规则中跳过可选的 space,然后在每个可以跟随 space 的终端之后再次跳过。这里的终端是字符串、字符集等。所以在 assign
的开头,在 variable
、boolean
、number
上的 {} 块之前,以及在您的'='、'-' 和 '+' 文字,添加对规则 s
的调用以跳过任何 spaces.
这项政策对我很有效。有一个最小值 space 的测试用例和另一个具有最大值 space 的测试用例(在所有可能的地方)是个好主意。
大家早上好,
我目前正在尝试描述一些基本的 Ruby 语法,但我现在受困于解析 space?
我可以处理 x = 1 + 1,
但无法解析 x=1+1,
我如何解析 space?
我已经尝试在每个终端后添加足够的 space 。
但它无法解析,给一个零.....
我该如何解决?
非常感谢,祝你有愉快的一天。
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
此代码有效 问题已解决!!!!
仅仅定义 space 规则是不够的,您必须在可能 space 的任何地方使用它。因为这种情况经常发生,所以我通常使用较短的规则名称 S
来表示强制性的 space,而使用小写的 s
来表示可选的 space.
然后,作为原则,我首先在我的最高规则中跳过可选的 space,然后在每个可以跟随 space 的终端之后再次跳过。这里的终端是字符串、字符集等。所以在 assign
的开头,在 variable
、boolean
、number
上的 {} 块之前,以及在您的'='、'-' 和 '+' 文字,添加对规则 s
的调用以跳过任何 spaces.
这项政策对我很有效。有一个最小值 space 的测试用例和另一个具有最大值 space 的测试用例(在所有可能的地方)是个好主意。