2013-03-04 1 views
0

Я работаю над парсером COBOL, используя JavaCC. Файл COBOL обычно будет иметь столбцы с 1 по 6 в виде строк/столбцов. Если номера строк/столбцов отсутствуют, у них будут пробелы.Обработка комментариев и номеров строк/столбцов в грамматике COBOL с использованием Javacc

Мне нужно знать, как обрабатывать комментарии и область последовательности в файле COBOL и анализировать только Main Area.

Я пробовал много выражений, но никто не работает. Я создал специальный токен, который будет проверять новую строку, а затем шесть вхождений пробелов или любого символа, кроме пробела и возврата каретки, и после этого седьмой символ будет "*" для комментариев и " " для обычных строк.

Я использую файл Cobol.jj доступный здесь http://java.net/downloads/javacc/contrib/grammars/cobol.jj

Может кто-нибудь предложить мне, что грамматика я должен использовать?

образец моего файла грамматика:

PARSER_END(CblParser) 

//////////////////////////////////////////////////////////////////////////////// 
// Lexical structure 
//////////////////////////////////////////////////////////////////////////////// 

SPECIAL_TOKEN : 
{ 
    < EOL: "\n" > : LINE_START 
| < SPACECHAR: (" " | "\t" | "\f" | ";" | "\r")+ > 
} 

SPECIAL_TOKEN : 
{ 
    < COMMENT: (~["\n","\r"," "] ~["\n","\r"," "] ~["\n","\r"," "] ~["\n","\r"," "] ~["\n","\r"," "] ~["\n","\r"," "]) ("*" | "|") (~["\n","\r"])* > 
| < PREPROC_COMMENT: "*|" (~["\n","\r"])* > 
| < SPACE_SEPARATOR : (<SPACECHAR> | <EOL>)+ > 
| < COMMA_SEPARATOR : "," <SPACE_SEPARATOR> > 
} 

<LINE_START> SKIP : 
{ 
< ((~[])(~[])(~[])(~[])(~[])(~[])) (" ") > 
} 

ответ

1

Поскольку анализатор начинается в начале строки, вы должны использовать состояние по умолчанию для представления начала строки. Я бы сделал что-то вроде следующего [непроверенный код следует].

// At the start of each line, the first 6 characters are ignored and the 7th is used 
// to determine whether this is a code line or a comment line. 
// (Continuation lines are handled elsewhere.) 
// If there are fewer than 7 characters on the line, it is ignored. 
// Note that there will be a TokenManagerError if a line has at least 7 characters and 
// the 7th character is other than a "*", a "/", or a space. 
<DEFAULT> SKIP : 
{ 
    < (~[]){0,6} ("\n" | "\r" | "\r\n") > :DEFAULT 
| 
    < (~[]){6} (" ") > :CODE 
| 
    < (~[]){6} ("*"|"/") :COMMENT 
} 

<COMMENT> SKIP : 
{ // At the end of a comment line, return to the DEFAULT state. 
    < "\n" | "\r" | "\r\n" > : DEFAULT 
| // All non-end-of-line characters on a comment line are ignored. 
    < ~["\n","\r"] > : COMMENT 
} 
<CODE> SKIP : 
{ // At the end of a code line, return to the DEFAULT state. 
    < "\n" | "\r" | "\r\n" > : DEFAULT 
| // White space is skipped, as are semicolons. 
    < (" " | "\t" | "\f" | ";")+ > 
} 
<CODE> TOKEN : 
{ 
    < ACCEPT: "accept" > 
| 
    ... // all rules for tokens should be in the CODE state. 
} 
+0

Я не уверен, что точки с запятой следует рассматривать как пробелы. Я просто копировал из парсера Тири Блайнда. Одно небольшое изменение, которое я сделал, заключалось в том, чтобы лечить \ r сам по себе как законный конец строки (если сразу не следовать \ n "). –

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

  • Нет связанных вопросов^_^