Как сделать ключевые слова узнаваемыми в simpleparse? - PullRequest
0 голосов
/ 18 ноября 2008

Я пытался создать парсер с помощью simpleparse. Я определил грамматику так:

<w> := [ \n]*
statement_list := statement,(w,statement)?
statement := "MOVE",w,word,w,"TO",w,(word,w)+
word := [A-Za-z],[A-Za-z0-9]*,([-]+,[A-Za-z0-9]+)*

Теперь, если я попытаюсь разобрать строку

MOVE ABC-DEF TO ABC
MOVE DDD TO XXX

Второе утверждение интерпретируется как параметры первого ... Это отстой и, очевидно, не то, что я хочу. Я смог заставить это работать с использованием pyparsing, как это:

word = Word(alphas,alphanums+'-')
statement = "MOVE"+word+"TO"+word
statement_list = OneOrMore(statement.setResultsName('statement',True))

Есть ли способ заставить это работать и в simpleparse?

РЕДАКТИРОВАТЬ: пояснение ниже

Я не пытаюсь достичь линейной грамматики. То, что я хотел бы видеть разобранным:

Простой кейс

MOVE AA TO BB

Более сложный чехол

MOVE AA TO BB 
           CC DD 
           EE FF

Несколько из приведенных выше оценок

MOVE AA TO BB 
           CC
MOVE CC TO EE
MOVE EE TO FF 
           GG 
           HH IIJJK

1 Ответ

1 голос
/ 18 ноября 2008

Грамматика в настоящее время неоднозначна. На бумаге вы не можете выполнить синтаксический анализ, если «ПЕРЕМЕСТИТЬ А В ПЕРЕМЕЩЕНИЕ C К D» ​​- это два утверждения или одно утверждение с конкретными плохо названными адресатами.

У вас есть два ответа. Вам может не понравиться ни один.

  1. Вы явно указываете, что ваше СЛОВО не совпадает ни с одним зарезервированным словом. То есть вы специально запрещаете совпадение MOVE или TO. Это эквивалентно высказыванию «MOVE не является допустимым именем параметра». Это делает "MOVE TL TO TM TN TO" ошибкой.

  2. Вы изменяете свою грамматику, чтобы вы могли сказать, где заканчивается утверждение. Вы можете добавить запятые "MOVE AA TO BB, CC MOVE TM TO TN, TO, TP". Вы можете добавить точки с запятой или пустые строки в конце операторов. Вы могли бы потребовать, чтобы MOVE был с наименьшим отступом, как Python.

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