Как я могу проанализировать список пар имя = значение в генераторе синтаксического анализатора (ANTLR, YACC и т. д.)?

StackOverflow https://stackoverflow.com/questions/897934

Вопрос

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

name1=value1 name2=value2 ...

где:

  • NAME может содержать что угодно, кроме пробелов и знака равенства.
  • VALUE может содержать что угодно, кроме пробелов (включая знаки равенства!)

Проблема заключается в том, чтобы синтаксический анализатор сопоставлял вводимые данные, например

name1=value1

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

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

Это было полезно?

Решение

Вот что-то в 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  :  ~(' ' | '=')*;

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top