我正在尝试使用Parse :: RecDescent解析一些文本
from :
x=2 and y=2 and f=3 and (x has 3,4 or r=5 or r=6 ) and z=2
to something like :
x equal 2 and y equal 2 and f equal 3 and (( x contains 3 or x contains 4 or r equal 5 or requal 6 )) and z equal 2
其他示例:
input :
x= 3 and y has 5 and (z has 6 or z=3 ) and f=2
output :
x equals 3 and (( y contains 5)) and ((z has 6 or z equals 3)) and f equals 2
我的问题是,如果我找到这些操作员的列表:
有,或
我应该按照上述示例中的说明在代码后加上“((“在代码前,“))”
是否可以使用Parse :: RecDescent做类似的事情?
答案 0 :(得分:1)
语法如下:
parse : expr EOF
expr : logic_or
# vvv Lowest precedence vvv
logic_or : <leftop: logic_and LOGIC_OR logic_and>
logic_and : <leftop: comparison LOGIC_AND comparison>
comparison : term comparison_[ $item[1] ]
comparison_ : '=' term
| HAS ident_list
|
# ^^^ Highest precedence ^^^
ident_list : <leftop: IDENT ',' IDENT>
term : '(' expr ')'
| IDENT
# Tokens
IDENT : /\w+/
LOGIC_OR : /or\b/
LOGIC_AND : /and\b/
HAS : /has\b/
EOF : /\Z/
现在,您只需要添加代码块即可发出所需的输出。
在comparison_
中,LHS术语可作为$arg[0]
使用。
我必须做一些假设,所以可能会有错误。