Как я могу проанализировать список пар имя = значение в генераторе синтаксического анализатора (ANTLR, YACC и т. Д.)? - PullRequest
1 голос
/ 22 мая 2009

Я хочу проанализировать список (разделенных пробелами) пар в виде

name1=value1 name2=value2 ...

где:

  • ИМЯ может содержать все, кроме пробелов и знака равенства
  • VALUE может содержать все, кроме пробелов (включая знаки равенства!)

Проблема в том, что парсер совпадает с вводом, как

name1=value1

как отдельные 'NAME EQUALS VALUE' токены, а не как один 'VALUE' токен.

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

Ответы [ 3 ]

1 голос
/ 19 июня 2009

Вот что-то в antlr, которое разбирает это;

a=b=c=d c=d e=f

Это может быть не все, что вам нужно, но это должно быть ядро.

grammar NameValuePairs;

pairs   :  namevaluepair (WS namevaluepair)*;

namevaluepair
  :  name '=' value;

name  :  ID;

value  :  ID ('=' ID)*;

WS  :  ' ' {skip()};

EQ  :  '=';

ID  :  ~(' ' | '=')*;
0 голосов
/ 22 мая 2009

Вам не нужен сильный анализатор для пар имя-значение, достаточно регулярного выражения. Если у вас нет какой-либо контекстной или вложенной структуры, эта «работа» принадлежит лексеру, а не парсеру:)

0 голосов
/ 22 мая 2009

Я думаю, вы можете столкнуться с проблемой, если VALUE может содержать знак равенства. Я думаю, что было бы лучше, если это возможно, сделать знак равенства зарезервированным символом или переключиться на другой зарезервированный символ для обозначения '='.

Я не уверен, что это сработает в контексте вашего большего парсера, но вы можете разделить пространство, предоставив вам массив (или любую структуру данных, которую использует ваш язык) пар 'NAME = VALUE'. Затем переберите массив и снова разделите зарезервированный символ, который вы используете для '='. Если вы не можете изменить или зарезервировать '=', вы можете использовать регулярное выражение, чтобы просто соответствовать первому экземпляру '='. Надеюсь, я не далеко от базы!

...