Как я могу проанализировать список пар имя = значение в генераторе синтаксического анализатора (ANTLR, YACC и т. д.)?
-
23-08-2019 - |
Вопрос
Я хочу проанализировать список пар (разделенных пробелами) в форме
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 может содержать знак равенства.Я думаю, что было бы лучше, если это возможно, сделать знак равенства зарезервированным символом или переключиться на другой зарезервированный символ, обозначающий «=».
Я не уверен, будет ли это работать в контексте вашего более крупного парсера, но вы можете разделить пространство, предоставив вам массив (или любую другую структуру данных, которую будет использовать ваш язык) пар «ИМЯ = ЗНАЧЕНИЕ».Затем пройдитесь по массиву и снова разделите его на зарезервированный символ, который вы используете для '='.Если вы не можете изменить или зарезервировать «=», вы можете использовать регулярное выражение, чтобы оно соответствовало первому экземпляру «=».Надеюсь, я не заблудился!
Вам не нужен сильный анализатор пар «имя-значение», достаточно регулярного выражения.Если у вас нет какой-либо контекстной или вложенной структуры, эта «работа» принадлежит лексеру, а не парсеру :)