大家早上好,
我目前正在尝试描述一些基本的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
此代码有效 问题解决了!!!!
答案 0 :(得分:2)
定义空间规则还不够,你必须在任何可能存在空间的地方使用它。因为这种情况经常发生,所以我通常使用较短的规则名称S
作为必填空间,使用小写版本s
作为可选空间。
然后,作为一个原则,我首先跳过我的顶级规则中的可选空间,然后再跳过每个可以跟随空格的终端。这里的终端是字符串,字符集等。所以在assign
的开头,variable
,boolean
,number
的{}阻止之前,以及之后' =',' - '和' +'文字,添加对规则s
的调用以跳过任何空格。
这项政策对我很有用。拥有一个具有最小空间的测试用例和另一个具有最大空间的情况(在所有可能的位置)是一个好主意。