2010-10-29 3 views
3

Есть ли какие-либо инструменты Java с открытым исходным кодом для синтаксического анализа вывода FORTRAN? Я хотел бы, чтобы иметь возможность написать что-то наподобиеАнализ выходных файлов FORTRAN с использованием Java

Format format = new Format("(1x, 2(F10.3,I3,' XY ',F7.3))"); 
String s = " -12345.897 XY 123.456-12345.897*** XY 123.456"; 
Result result = format.parse(s); 

Обратите внимание, что это специально FORTRAN. Обратите внимание на забавные вещи, такие как конкатенированные поля, переполнения, пустое пространство = 0 и т. Д. Есть так много ошибок, что я не хочу их снова открывать!

КОММЕНТАРИЙ. Я не понимаю, почему это неправильный путь. Формат представляет собой сжатый способ генерации кода чтения. Альтернативой было бы жесткое кодирование для каждого формата. Если у меня есть файл с - скажем, 100 различных FORMAT-выходов, тогда у меня должно быть 100 кусков кода. С iChemLabs подходить я пишу:

List<Object> fields = FortranFormat.read(s, format); 

и получить обратно Double Integer String, Double Double Integer Струнный Double

UPDATE: Я проверил iChemLabs на разумном количестве вещей. С пробелами он возвращает нулевые целые числа и парные разряды. С * это исключение (не необоснованное). Он может управлять несколькими линиями

fields = FortranFormat.read(" 1\n 2", "(I4/I4)"); 

возвращает 2 Целых (1 и 2)

UPDATE: Код iChemLabs специально позволяет пустой ввод (но не звездочки):

public void setReturnZeroForBlanks(boolean returnZeroForBlanks) 

    Set whether zeros are returned for blanks. 

    Parameters: 
     returnZeroForBlanks - the return zero for blanks 
+0

Я полагаю, я не понимаю, почему программа, которая читает вывод Fortran, должна использовать такой же форматированный механизм формата, чтобы читать его. Является ли вывод не всегда разделенным символом или фиксированной шириной? –

+0

@TE, так как нужно как-то описать формат, и формат, используемый в приложении Fortran, который сгенерировал выход, предположительно доступен, будет удобно использовать одно и то же описание. И, как говорит OP, существуют тайные правила, регулирующие этот выходной формат, который он не хочет переделывать. –

+0

@TE В этом примере после 897 есть 3 пробела. Они помещаются как целое число 0, а не строка пробелов. Есть еще хуже - FORTRAN имеет забавные вещи с десятичной численностью. –

ответ

3

This seems to do it (как выход, так и вход). Последнее обновление: 1998!

Another one here - выглядит немного более полированным? from iChemLabs

+0

Отлично - именно то, что нужно. –

+0

Я выбрал (особенно потому, что это химический), но публично благодарит Jocelyn Paine за первое. Я надеюсь, что mavenize iChemLabs один (второй) –

+0

iChemLabs используют BNF для генерации кода с использованием JavaCC. Единственный недостаток заключается в том, что они не опубликуйте BNF, поэтому, если есть ошибка, это невозможно исправить. Я напишу им. –

Смежные вопросы