Question

J'essaie de déterminer le meilleur moyen d'analyser un fichier de trace GE Logician MEL pour faciliter la lecture.

Il a des segments comme

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

et

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

Je pouvais ramper en procédant de manière procédurale, mais après toutes les expressions rationnelles avec lesquelles j'ai travaillé, j'ai du mal à croire que rien ne me permette de définir les règles pour analyser le fichier de la même manière. Est-ce que je me trompe?

Était-ce utile?

La solution

Faites une grammaire en utilisant ANTLR. Si vous utilisez C, lex / yacc est natif. ANTLR crée des analyseurs syntaxiques natifs en Java, Python et .NET. Votre sortie ressemble à une réplique; essayez de demander au fournisseur une spécification sur la langue d'entrée.

Autres conseils

Antlr ferait l'affaire.

Si vous utilisez Perl pour l'analyse. L'équivalent Perl de YACC serait le module Parse :: Yapp . Lorsque j'ai traduit une grammaire yacc pour l'utiliser avec mon code Perl, la traduction était principalement mécanique. Il existe également un générateur d’analyseur de descente récursif, lent mais puissant: Parse :: RecDescent .

Vous pouvez essayer ANTLR ou lex / yacc.

Si c’était moi, je tirerais une grammaire sans contexte et la brancherais à un générateur d’analyseur, probablement la bibliothèque de combinateurs de Scala. Cependant, cette grammaire semble assez facile à analyser à la main, il suffit de garder à l’esprit la théorie des automates et cela ne devrait pas poser de problème.

J'imagine que vous pourriez utiliser des outils tels que LEX, FLEX, CUP, ANTLR ou YACC (ou leurs équivalents, quel que soit le langage de programmation que vous utilisez. Tous les langages de programmation traditionnels ont une certaine palette de ceux-ci.) pour analyser les fichiers s'ils avoir une structure spécifique [plus précisément, si elles pourraient être représentées par une grammaire]. Ceux-ci pourraient ne pas fonctionner pour des points plus fins cependant.

Il existe un langage de programmation appelé Haskell qui contient une excellente bibliothèque d’analyses que vous pourriez essayer. www.haskell.org et http://legacy.cs.uu.nl/daan/ parsec.html pour plus de détails

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top