Инструмент для разбора файла - PullRequest
2 голосов
/ 16 сентября 2008

Я пытаюсь найти лучший способ анализа файла трассировки 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 ]

4 голосов
/ 16 сентября 2008

Составьте грамматику, используя ANTLR. Если вы используете C, lex / yacc являются нативными. ANTLR создает собственные синтаксические анализаторы в Java, Python и .NET. Ваш вывод выглядит как репл; попробуйте спросить у продавца спецификацию на языке ввода.

2 голосов
/ 18 сентября 2008

Если вы используете Perl для разбора. Perl-эквивалент YACC будет модулем Parse :: Yapp . Когда я перевел грамматику yacc для использования с моим кодом Perl, перевод был в основном механическим. Есть также генератор синтаксического анализатора рекурсивного спуска, который является медленным, но мощным: Parse :: RecDescent .

2 голосов
/ 16 сентября 2008

Antlr сделает свое дело.

1 голос
/ 16 сентября 2008

Есть язык программирования под названием Haskell, в котором есть отличная библиотека для разбора, которую вы можете попробовать. www.haskell.org и http://legacy.cs.uu.nl/daan/parsec.html для более подробной информации

1 голос
/ 16 сентября 2008

Я бы подумал, что вы могли бы использовать такие инструменты, как LEX, FLEX, CUP, ANTLR или YACC (или их эквиваленты для любого языка программирования, который вы используете. Любой основной язык программирования имеет некоторую разновидность этих доступных) для анализа файлов, если они иметь конкретную структуру [точнее, если бы они могли быть представлены грамматикой]. Это может не сработать для более тонких точек.

1 голос
/ 16 сентября 2008

Если бы это был я, я бы вывел контекстную грамматику и подключил ее к генератору синтаксического анализатора, возможно, к библиотеке комбинаторов Scala. Однако эту грамматику довольно просто разобрать вручную, просто помните о теории автоматов, и это не должно быть проблемой.

1 голос
/ 16 сентября 2008

Вы можете попробовать ANTLR или lex / yacc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...