Domanda

Sto cercando di capire il modo migliore per analizzare un file di traccia MEL di GE Logician per renderlo più facile da leggere.

Ha segmenti come

>{!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 " 

Potrei farlo in modo procedurale, ma dopo tutte le espressioni regolari con cui ho lavorato, trovo difficile credere che non ci sia nulla là fuori che mi permetta di definire le regole per l'analisi del file in modo simile.Ho sbagliato?

È stato utile?

Soluzione

Crea una grammatica usando ANTLR.Se usi C, lex/yacc sono nativi.ANTLR crea parser nativi in ​​Java, Python e .NET.Il tuo output sembra una sostituzione;prova a chiedere al venditore una specifica sulla lingua di input.

Altri suggerimenti

Antlr farebbe il trucco.

Nel caso in cui utilizzi Perl per l'analisi.L'equivalente Perl di YACC sarebbe il Parse::Yapp modulo.Quando ho tradotto una grammatica yacc da utilizzare con il mio codice Perl, la traduzione era per lo più meccanica.C'è anche un generatore di parser di discesa ricorsivo, che è lento ma potente: Analizza::RecDescent.

Potresti provare ANTLR o lex/yacc.

Se fossi in me, deriverei una grammatica libera dal contesto e la inserirei in un generatore di parser, probabilmente la libreria combinator di Scala.Tuttavia, questa grammatica sembra ragionevolmente facile da analizzare a mano, basta tenere presente la teoria degli automi e non dovrebbe essere un problema.

Immagino che potresti utilizzare strumenti come LEX, FLEX, CUP, ANTLR o YACC (o i loro equivalenti per qualunque linguaggio di programmazione tu stia utilizzando.Qualsiasi linguaggio di programmazione tradizionale ha qualche sapore di questi disponibili.) per analizzare i file se hanno una struttura specifica [più accuratamente, se possono essere rappresentati da una grammatica].Tuttavia, questi potrebbero non funzionare per i punti più fini.

C'è un linguaggio di programmazione chiamato Haskell che ha un'ottima libreria di analisi che potresti provare.www.haskell.org e http://legacy.cs.uu.nl/daan/parsec.html per ulteriori dettagli

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top