使用Parse :: RecDescent

时间:2018-10-27 08:59:59

标签: perl

我正在尝试使用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做类似的事情?

1 个答案:

答案 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]使用。

我必须做一些假设,所以可能会有错误。