синтаксический анализ текста с помощью Parse - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь разобрать текст с помощью 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 голосов
/ 28 октября 2018

Грамматика будет выглядеть примерно так:

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].

Я должен был сделать некоторые предположения, поэтому могут быть ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...