Como posso analisar uma lista de nome = valor pares em um gerador de analisador (ANTLR, YACC etc)?
-
23-08-2019 - |
Pergunta
Eu quero analisar uma lista de (espaços em branco separados) pares na forma de
name1=value1 name2=value2 ...
Onde:
- nome pode conter qualquer coisa, exceto espaços em branco e sinal de igual
- valor pode conter qualquer coisa, exceto espaço em branco (incluindo sinais de igual!)
O problema é conseguir o analisador para corresponder à entrada como
name1=value1
como fichas 'NAME EQUALS VALUE'
separadas, não como um único símbolo 'VALUE'
.
PS. Eu sei que isso é trivial para o código diretamente, mas eu preciso isto no contexto de um analisador maior.
Solução
Aqui está algo em antlr, que analisa este;
a=b=c=d c=d e=f
Isto não pode ser tudo que você precisa, mas deve ser o núcleo.
grammar NameValuePairs;
pairs : namevaluepair (WS namevaluepair)*;
namevaluepair
: name '=' value;
name : ID;
value : ID ('=' ID)*;
WS : ' ' {skip()};
EQ : '=';
ID : ~(' ' | '=')*;
Outras dicas
Eu acho que você pode acabar com um problema se o valor pode conter o sinal de igual. Eu acho que seria melhor, se possível, fazer o sinal de igual um caractere reservado, ou mude para um caractere reservado diferente para significar '='.
Eu não tenho certeza se isso iria funcionar no contexto do seu analisador maior, mas você pode dividir o espaço, dando-lhe uma matriz (ou qualquer estrutura de dados seu idioma usaria) de 'name = value' pares. Em seguida, percorrer a matriz e dividir novamente sobre o caráter reservado você está usando para '='. Se você não pode alterar ou reserva '=', você poderia regex apenas para coincidir com a primeira instância do '='. Espero que eu não estou longe de base!
Você não precisa de uma forte analisador para pares de valores de nome, regex seria suficiente. A menos que tenha alguma estrutura contextual ou aninhado, este 'trabalho' pertence ao léxico, não o analisador:)