Como posso analisar uma lista de nome = valor pares em um gerador de analisador (ANTLR, YACC etc)?

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

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.

Foi útil?

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:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top