解析文件的工具

时间:2008-09-16 17:40:03

标签: parsing

我正在尝试找出解析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 " 

我可以通过程序化来实现它,但是在我使用过的所有正则表达式之后,我发现很难相信没有什么可以让我以类似的方式定义解析文件的规则。我错了吗?

7 个答案:

答案 0 :(得分:4)

使用ANTLR制作语法。如果您使用的是C,则lex / yacc是原生的。 ANTLR使用Java,Python和.NET创建本机解析器。你的输出看起来像一个repl;尝试向供应商询问输入语言的规范。

答案 1 :(得分:2)

Antlr可以解决问题。

答案 2 :(得分:2)

如果您使用Perl进行解析。 YACC的Perl等价物将是the Parse::Yapp模块。当我翻译yacc语法以使用我的Perl代码时,翻译主要是机制的。还有一个递归下降解析器生成器,它很慢但功能强大:Parse::RecDescent

答案 3 :(得分:1)

您可以尝试使用ANTLR或lex / yacc。

答案 4 :(得分:1)

如果是我,我会得到一个无上下文的语法并将其插入解析器生成器,可能是Scala的组合库。然而,这个语法看起来相当容易手工解析,只要牢记自动机理论,它应该不是问题。

答案 5 :(得分:1)

我想你可以使用像LEX,FLEX,CUP,ANTLR或YACC这样的工具(或者它们用于你正在使用的任何编程语言的等价物。任何主流编程语言都有一些可用的。)如果他们解析文件具有特定的结构[更准确地说,如果它们可以用语法表示]。但这些可能不适用于更精细的点。

答案 6 :(得分:1)

有一种名为Haskell的编程语言,它有一个很棒的解析库,你可能会尝试。 www.haskell.org和http://legacy.cs.uu.nl/daan/parsec.html了解更多详情