2008-09-16 8 views
2

J'essaie de trouver la meilleure façon d'analyser un fichier de trace GE Logician MEL pour le rendre plus facile à lire.Outil pour analyser un fichier

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 prosterner par faire de la procédure, mais après toutes les regexps j'ai travaillé, je trouve difficile de croire qu'il n'y a rien là-bas qui me permettra de définir les règles pour l'analyse du fichier d'une manière similaire. Ai-je tort?

Répondre

4

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

+0

Merci, je n'avais pas encore rencontré Antlr. J'avais entendu parler de lex et yacc, mais je ne savais pas s'il y avait quelque chose de mieux à utiliser. – SarekOfVulcan

1

Vous pouvez essayer ANTLR ou lex/yacc.

1

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

1

J'imagine que vous pourriez utiliser des outils comme LEX, FLEX, CUP, ANTLR ou YACC (ou leurs équivalents pour le langage de programmation que vous utilisez.) Tout langage de programmation courant a une certaine saveur de ces disponibles. ils ont une structure spécifique [plus précisément, s'ils peuvent être représentés par une grammaire]. Ceux-ci pourraient ne pas fonctionner pour des points plus fins cependant.

2

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

Questions connexes