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
跳过任何空格。
此政策适用于我。有一个最小空间的测试用例和另一个具有最大空间(所有可能的地方)的情况是一个好主意。
我已经在每个终端后添加足够的空间,但它显示无.......... T_T – DoubleMay
你还没有做我说的。在每个规则的开始处,或者在调用像'expression'这样以跳过空格结束的规则之后,你不需要'space',在开始时需要它的唯一规则是'main'。但是你仍然失败,因为你的''+''和类似的文字中有空格。删除这些空格。你还必须在'true'和'false'之后直接放置'![a-z]';之后跳过空格。 – cliffordheath
神圣的耶稣,它的作品!!!!!!!!!非常感谢!!!!!!!!!!!!! – DoubleMay