Pergunta

Estou tentando descobrir a melhor maneira de analisar um arquivo de rastreamento GE Logician MEL para facilitar a leitura.

Possui segmentos como

>{!gDYNAMIC_3205_1215032915_810 = (clYN)}
execute>GDYNAMIC_3205_1215032915_810 = "Yes, No"
results>"Yes, No" 
execute>end 
results>"Yes, No" 

>{!gDYNAMIC_3205_1215032893_294 = (clYN)}
execute>GDYNAMIC_3205_1215032893_294 = "Yes, No"
results>"Yes, No" 
execute>end 
results>"Yes, No" 

e

>{IF (STR(F3205_1220646638_285, F3205_1220646638_301) == "") THEN "" ELSE (\par\tab fnHeadingFormat("Depression") + CFMT(F3205_1220646638_285, "", "Have you often been bothered by feeling down, depressed or hopeless? ", "B", "\par ") + CFMT(F3205_1220646638_301, "", "Have you often been bothered by little interest or pleasure in doing things? ", "B", "\par ") ) ENDIF}
execute>call STR("No", "No")
results>"NoNo" 
execute>"NoNo" == ""
results>FALSE 
execute>if FALSE
results>FALSE 
execute>call FNHEADINGFORMAT("Depression")
execute>call CFMT("Depression", "B,2")
results>"\fs24\b Depression\b0\fs20 " 
execute>"\r\n" + "\fs24\b Depression\b0\fs20 "
results>"\r\n\fs24\b Depression\b0\fs20 " 
execute>"\r\n\fs24\b Depression\b0\fs20 " + "\r\n"
results>"\r\n\fs24\b Depression\b0\fs20 \r\n" 
results>return "\r\n\fs24\b Depression\b0\fs20 \r\n" 
execute>call CFMT("No", "", "Have you often been bothered by feeling down, depressed or hopeless? ", "B", "\par ")
results>"\b Have you often been bothered by feeling down, depressed or hopeless? \b0 No\par " 
execute>"\r\n\fs24\b Depression\b0\fs20 \r\n" + "\b Have you often been bothered by feeling down, depressed or hopeless? \b0 No\par "
results>"\r\n\fs24\b Depression\b0\fs20 \r\n\b Have you often been bothered by feeling down, depressed or hopeless? \b0 No\par " 
execute>call CFMT("No", "", "Have you often been bothered by little interest or pleasure in doing things? ", "B", "\par ")
results>"\b Have you often been bothered by little interest or pleasure in doing things? \b0 No\par " 
execute>"\r\n\fs24\b Depression\b0\fs20 \r\n\b Have you often been bothered by feeling down, depressed or hopeless? \b0 No\par " + "\b Have you often been bothered by little interest or pleasure in doing things? \b0 No\par "
results>"\r\n\fs24\b Depression\b0\fs20 \r\n\b Have you often been bothered by feeling down, depressed or hopeless? \b0 No\par \b Have you often been bothered by little interest or pleasure in doing things? \b0 No\par " 

Eu poderia rastejar fazendo isso de maneira processual, mas depois de todos os regexps com os quais trabalhei, acho difícil acreditar que não haja nada por aí que me permita definir as regras para analisar o arquivo de maneira semelhante.Estou errado?

Foi útil?

Solução

Faça uma gramática usando ANTLR.Se você estiver usando C, lex/yacc são nativos.ANTLR cria analisadores nativos em Java, Python e .NET.Sua saída parece uma réplica;tente pedir ao fornecedor uma especificação do idioma de entrada.

Outras dicas

Antlr faria o truque.

Caso você esteja usando Perl para análise.O equivalente Perl do YACC seria o Analisar::Yapp módulo.Quando traduzi uma gramática yacc para uso com meu código Perl, a tradução foi principalmente mecânica.Há também um gerador de analisador descendente recursivo, que é lento, mas poderoso: Analisar::RecDescent.

Você poderia tentar ANTLR ou lex/yacc.

Se fosse eu, derivaria uma gramática livre de contexto e a conectaria a um gerador de analisador, provavelmente a biblioteca combinadora do Scala.No entanto, esta gramática parece razoavelmente fácil de analisar manualmente, basta ter em mente a teoria dos autômatos e isso não deve ser um problema.

Eu imagino que você poderia usar ferramentas como LEX, FLEX, CUP, ANTLR ou YACC (ou seus equivalentes para qualquer linguagem de programação que estiver usando).Qualquer linguagem de programação convencional tem algum tipo disso disponível.) para analisar os arquivos se eles tiverem uma estrutura específica [mais precisamente, se puderem ser representados por uma gramática].No entanto, isso pode não funcionar para pontos mais delicados.

Existe uma linguagem de programação chamada Haskell que possui uma ótima biblioteca de análise que você pode experimentar.www.haskell.org e http://legacy.cs.uu.nl/daan/parsec.html para mais detalhes

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