2008-09-16 53 views
2

我在想解析GE Logician MEL跟蹤文件以便於閱讀的最佳方法。解析文件的工具

它像

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

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

我可以通過程序上做卑躬屈膝,但我曾經使用過的正則表達式後,我覺得很難相信沒有什麼在那裏可以讓我以類似的方式定義解析文件的規則。我錯了嗎?

回答

4

使用ANTLR創建語法。如果你使用C,lex/yacc是本地的。 ANTLR用Java,Python和.NET創建本地解析器。你的輸出看起來像一個repl;請嘗試詢問供應商有關輸入語言的規格。

+0

謝謝,我以前沒碰到過Antlr。我聽說過lex和yacc,但我不知道是否有更好的東西可以使用。 – SarekOfVulcan 2008-09-16 17:49:45

1

你可以試試ANTLR或者lex/yacc。

1

如果是我,我會派生一個上下文無關語法並將其插入解析器生成器,可能是Scala的combinator庫。然而,這個語法看起來很容易用手分析,只要記住自動機理論,它不應該是一個問題。

1

我會想象你可以使用像LEX,FLEX,CUP,ANTLR或YACC這樣的工具(或者它們與你使用的任何編程語言的等價物,任何主流編程語言都有這些可用的風格)來解析文件if他們有一個特定的結構[更準確地說,如果他們可以用語法來表示]。這些可能不適用於更好的點。

2

如果您使用Perl進行分析。 YACC的Perl相當於the Parse::Yapp模塊。當我翻譯用於Perl代碼的yacc語法時,翻譯主要是機械的。還有一個遞歸下降解析器生成器,它很慢但功能強大:Parse::RecDescent