2

我试图找出解析 GE Logician MEL 跟踪文件以使其更易于阅读的最佳方法。

它有像

>{!gDYNAMIC_3205_1215032915_810 = (clYN)}
执行>GDYNAMIC_3205_1215032915_810 = “是,否”
结果>“是,否”
执行>结束
结果>“是,否”

>{!gDYNAMIC_3205_1215032893_294 = (clYN)}
执行>GDYNAMIC_3205_1215032893_294 = “是,否”
结果>“是,否”
执行>结束
结果>“是,否”

>{IF (STR(F3205_1220646638_285, F3205_1220646638_301) == "") THEN "" ELSE (\par\tab fnHeadingFormat("Depression") + CFMT(F3205_1220646638_285, "", "你是否经常被情绪低落、沮丧或无望?", "B", "\par ") + CFMT(F3205_1220646638_301, "", "你是否经常被做事的兴趣或乐趣所困扰?", "B", "\par ") ) ENDIF}
执行>调用STR(“否”,“否”)
结果>“NoNo”
执行>“否”==“”
结果>错误
执行>如果为假
结果>错误
执行>调用 FNHEADINGFORMAT("抑郁症")
执行>调用 CFMT("抑郁症", "B,2")
结果>"\fs24\b 抑郁\b0\fs20 "
执行>"\r\n" + "\fs24\b 郁闷\b0\fs20 "
结果>"\r\n\fs24\b 抑郁症\b0\fs20 "
执行>"\r\n\fs24\b 抑郁\b0\fs20 " + "\r\n"
结果>"\r\n\fs24\b 抑郁症\b0\fs20 \r\n"
结果>返回 "\r\n\fs24\b 抑郁症\b0\fs20 \r\n"
execute>call CFMT("No", "", "你是否经常被情绪低落、沮丧或绝望所困扰?", "B", "\par ")
结果>"\b 你是否经常被情绪低落、沮丧或绝望所困扰?\b0 没有\par "
执行>"\r\n\fs24\b 抑郁\b0\fs20 \r\n" + "\b 你是否经常被情绪低落、沮丧或绝望所困扰?\b0 没有\par "
结果>"\r\n\fs24\b 抑郁\b0\fs20 \r\n\b 你是否经常被情绪低落、沮丧或绝望所困扰?\b0 没有\par "
execute>call CFMT("No", "", "你是否经常被做事的兴趣或乐趣所困扰?", "B", "\par ")
结果>"\b 你是否经常因为做事没有兴趣或快乐而烦恼?\b0 没有\par "
执行>"\r\n\fs24\b 抑郁\b0\fs20 \r\n\b 你是否经常被情绪低落、沮丧或绝望所困扰?\b0 没有\par " + "\b 你是否经常被困扰对做事缺乏兴趣或乐趣?\b0 没有\par "
结果>"\r\n\fs24\b 抑郁\b0\fs20 \r\n\b 你是否经常被情绪低落、沮丧或绝望所困扰?\b0 没有\par \b 你是否经常被无趣所困扰还是乐于做事?\b0 没有\par "

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

4

7 回答 7

4

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

于 2008-09-16T17:44:09.323 回答
2

Antlr可以解决问题。

于 2008-09-16T17:41:27.333 回答
2

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

于 2008-09-18T10:32:53.900 回答
1

你可以试试 ANTLR 或 lex/yacc。

于 2008-09-16T17:41:36.927 回答
1

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

于 2008-09-16T17:43:14.600 回答
1

我想您可以使用 LEX、FLEX、CUP、ANTLR 或 YACC 之类的工具(或您使用的任何编程语言的等效工具。任何主流编程语言都有这些可用的味道。)来解析文件,如果它们有特定的结构[更准确地说,如果它们可以用语法来表示的话]。不过,这些可能不适用于更精细的点。

于 2008-09-16T17:44:14.283 回答
1

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

于 2008-09-16T17:49:32.320 回答