Como analisar uma sintaxe personalizada simples no Go?

5

Eu tenho uma quantidade limitada de tipos de entrada:

34:56 = sensorA#, sensorA#, sensorB#
2:5 = { led# }
66 = otherSensor
2,3,4,5 = greenRelay#, redRelay#, relayA#, relayA#
  • a: b implica em intervalo.
  • {name} implica um nome global para o conjunto de dados.
  • # representa a enumeração automática no nome (não relevante para o pergunta)
  • Valores únicos ou valores separados por coma significam o que você espera para isso.
  • Menos nomes que valores implicam atribuição automática de nome (não relevante para a pergunta)

Eu preciso extrair os valores numéricos do lado esquerdo da expressão e os nomes do lado direito para que eu possa iterar para atribuir os nomes aos valores. Eu não sei quente para lidar com essa tarefa, eu tenho lido e tenho procurado uma solução, mas eu gostaria de alcançar uma boa metodologia para este caso.

Devo substituir todos os espaços e tabulações antes do processamento?

Devo usar o regex apenas para verificar a exatidão da entrada ou algo mais?

Devo usar apenas manipulação de string simples? Eu estou usando Golang e strings são imutáveis, a manipulação de strings implica alocações e muito código (a velocidade não é MUITO importante aqui, mas eu gostaria de encontrar a maneira correta de resolver isso).

Devo escrever um lexer e parser para isso?

    
por Lupo Dharkael 27.01.2017 / 21:20
fonte

1 resposta

2

Should I replace all the spaces and tabs before processing?

Você pode fazer isso se quiser que o espaço em branco seja tão sem sentido quanto em c, c ++, java, c #.

Isso significa fazer uma passagem dupla pelo arquivo. Para arquivos muito grandes, isso pode ser proibitivo porque força você a manter tudo na memória ou criar um arquivo temporário. Existem técnicas para consumir espaço em branco na hora. Considere-os antes de recorrer a isso.

Should I use regex just to verify the correctness of the input or for something more?

Nem todo idioma pode ser validado com regex. Certifique-se de qual categoria você está antes de se comprometer com ela.

Should I use just plain string manipulation? I'm using Golang and strings are immutable, string manipulation implies allocations and a lot of code (speed is not REALLY important here but I'd like to find the correct way to solve this).

"Muito código" não é uma boa maneira de definir um idioma. Aqui está uma boa maneira:

link

Should I write a lexer and parser for this?

Isso oferece o maior poder de qualquer coisa que você mencionou. Existem provavelmente alternativas mais simples que se centralizam em torno da reutilização de analisadores escritos para coisas como json ou xml, mas você está apenas empurrando seus tipos de entrada para um formato de dados diferente.

    
por 28.01.2017 / 17:07
fonte