2012-11-13 4 views
0

Я использую этот grammar для генерации парсера COBOL.COBOL Parser с использованием javacc + PMD

Я использую javacc для генерации парсера и Java Tree Builder для генерации AST из этой грамматики.

Я настраиваю плагин eclipse под названием PMD, чтобы прочитать файл COBOL и сгенерировать AST. Существует пользовательский интерфейс, называемый Designer, который позволяет вам заполнить AST из исходного кода.

Когда я пытаюсь с помощью исходного кода, приведенную ниже, у меня есть сообщение об ошибке:

ОШИБКА СООБЩЕНИЕ

net.sourceforge.pmd.PMDException: Error while processing [no filename].cbl 
    at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:80) 
    at net.sourceforge.pmd.util.designer.Designer$DFAListener.actionPerformed(Designer.java:502) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
Caused by: net.sourceforge.pmd.lang.ast.ParseException: net.sourceforge.pmd.lang.cpd.cobol.ast.ParseException: Encountered "" at line 0, column 0. 
Was expecting one of: 

    at net.sourceforge.pmd.lang.cobol.CobolParser.parse(CobolParser.java:35) 
    at net.sourceforge.pmd.SourceCodeProcessor.parse(SourceCodeProcessor.java:90) 
    at net.sourceforge.pmd.SourceCodeProcessor.processSource(SourceCodeProcessor.java:136) 
    at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:75) 
    ... 37 more 
Caused by: net.sourceforge.pmd.lang.cpd.cobol.ast.ParseException: Encountered "" at line 0, column 0. 
Was expecting one of: 

    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.generateParseException(CobolParser.java:43571) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.jj_consume_token(CobolParser.java:43405) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.IdentificationDivision(CobolParser.java:3734) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.ProgramUnit(CobolParser.java:3527) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.CompilationUnit(CobolParser.java:3450) 
    at net.sourceforge.pmd.lang.cobol.CobolParser.parse(CobolParser.java:33) 
    ... 40 more 
Exception in thread "AWT-EventQueue-0" net.sourceforge.pmd.lang.ast.ParseException: net.sourceforge.pmd.lang.cpd.cobol.ast.ParseException: Encountered "" at line 0, column 0. 
Was expecting one of: 

    at net.sourceforge.pmd.lang.cobol.CobolParser.parse(CobolParser.java:35) 
    at net.sourceforge.pmd.util.designer.Designer.getCompilationUnit(Designer.java:135) 
    at net.sourceforge.pmd.util.designer.Designer.access$1(Designer.java:132) 
    at net.sourceforge.pmd.util.designer.Designer$ShowListener.actionPerformed(Designer.java:475) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
Caused by: net.sourceforge.pmd.lang.cpd.cobol.ast.ParseException: Encountered "" at line 0, column 0. 
Was expecting one of: 

    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.generateParseException(CobolParser.java:43571) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.jj_consume_token(CobolParser.java:43405) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.IdentificationDivision(CobolParser.java:3734) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.ProgramUnit(CobolParser.java:3527) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.CompilationUnit(CobolParser.java:3450) 
    at net.sourceforge.pmd.lang.cobol.CobolParser.parse(CobolParser.java:33) 
    ... 39 more 
net.sourceforge.pmd.PMDException: Error while processing [no filename].cbl 
    at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:80) 
    at net.sourceforge.pmd.util.designer.Designer$DFAListener.actionPerformed(Designer.java:502) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
Caused by: net.sourceforge.pmd.lang.ast.ParseException: net.sourceforge.pmd.lang.cpd.cobol.ast.ParseException: Encountered " "*" "* "" at line 2, column 7. 
Was expecting: 
    "program-id" ... 

    at net.sourceforge.pmd.lang.cobol.CobolParser.parse(CobolParser.java:35) 
    at net.sourceforge.pmd.SourceCodeProcessor.parse(SourceCodeProcessor.java:90) 
    at net.sourceforge.pmd.SourceCodeProcessor.processSource(SourceCodeProcessor.java:136) 
    at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:75) 
    ... 37 more 
Caused by: net.sourceforge.pmd.lang.cpd.cobol.ast.ParseException: Encountered " "*" "* "" at line 2, column 7. 
Was expecting: 
    "program-id" ... 

    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.generateParseException(CobolParser.java:43571) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.jj_consume_token(CobolParser.java:43405) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.ProgramIdParagraph(CobolParser.java:3925) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.IdentificationDivision(CobolParser.java:3741) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.ProgramUnit(CobolParser.java:3527) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.CompilationUnit(CobolParser.java:3450) 
    at net.sourceforge.pmd.lang.cobol.CobolParser.parse(CobolParser.java:33) 
    ... 40 more 
Exception in thread "AWT-EventQueue-0" net.sourceforge.pmd.lang.ast.ParseException: net.sourceforge.pmd.lang.cpd.cobol.ast.ParseException: Encountered " "*" "* "" at line 2, column 7. 
Was expecting: 
    "program-id" ... 

    at net.sourceforge.pmd.lang.cobol.CobolParser.parse(CobolParser.java:35) 
    at net.sourceforge.pmd.util.designer.Designer.getCompilationUnit(Designer.java:135) 
    at net.sourceforge.pmd.util.designer.Designer.access$1(Designer.java:132) 
    at net.sourceforge.pmd.util.designer.Designer$ShowListener.actionPerformed(Designer.java:475) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
Caused by: net.sourceforge.pmd.lang.cpd.cobol.ast.ParseException: Encountered " "*" "* "" at line 2, column 7. 
Was expecting: 
    "program-id" ... 

    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.generateParseException(CobolParser.java:43571) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.jj_consume_token(CobolParser.java:43405) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.ProgramIdParagraph(CobolParser.java:3925) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.IdentificationDivision(CobolParser.java:3741) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.ProgramUnit(CobolParser.java:3527) 
    at net.sourceforge.pmd.lang.cpd.cobol.ast.CobolParser.CompilationUnit(CobolParser.java:3450) 
    at net.sourceforge.pmd.lang.cobol.CobolParser.parse(CobolParser.java:33) 
    ... 39 more 

COBOL КОД

IDENTIFICATION DIVISION. 
    * 
    PROGRAM-ID. GETNUMT. 
    * 
    DATE-WRITTEN. 04/04/90. 
    * 
    * MODIFIED 10/18/97. 
    * 
    *  ******************************* 
    *  *        * 
    *  *  Judson D. McClendon  * 
    *  *  Sun Valley Systems  * 
    *  *  329 37th Court N.E.  * 
    *  *  Birmingham, AL 35215 * 
    *  *  205-853-8440   * 
    *  *        * 
    *  ******************************* 
    * 
    ENVIRONMENT DIVISION. 
    * 
    CONFIGURATION SECTION. 
    * 
    INPUT-OUTPUT SECTION. 
    * 
    FILE-CONTROL. 
    * 
    I-O-CONTROL. 
    * 
    DATA DIVISION. 
    * 
    FILE SECTION. 
    * 
    * 
    WORKING-STORAGE SECTION. 
    * 
    77 WS-ESCAPE-FLAG    PIC 9(01)  COMP VALUE 0. 
    77 WS-ERR-MSG     PIC X(30)   VALUE SPACES. 
    * 
    COPY GETNUMW.COB. 
    * 
    SCREEN SECTION. 
    * 
    * 
    *      I N P U T S C R E E N 
    * 
    01 INPUT-SCREEN 
      FOREGROUND-COLOR 7 
      BACKGROUND-COLOR 0. 
     03 BLANK SCREEN 
      LINE 01 COLUMN 31 VALUE "G E T N U M B E R". 
    * 
     03 LINE 03 COLUMN 01 VALUE "Enter Number: ". 
     03 PIC X(25)   USING NW-WORK-NBR. 
    * 
    * 
    *     O U T P U T S C R E E N 
    * 
    01 OUTPUT-SCREEN 
      FOREGROUND-COLOR 7 
      BACKGROUND-COLOR 0. 
    * 
     03 LINE 05 COLUMN 01 VALUE "  Result: ". 
     03 PIC -(13).9(06) FROM NW-EXTRACTED-NBR. 
     03   COLUMN 41 
      PIC X(30)   FROM WS-ERR-MSG. 
/
    PROCEDURE DIVISION. 
    * 
    * 
    *    C O N T R O L S E C T I O N 
    * 
    000000-CONTROL. 
    * 
     MOVE SPACES TO NW-WORK-NBR. 
     DISPLAY INPUT-SCREEN. 
    * 
     PERFORM 000100-PROCESS 
      THRU 000100-EXIT 
      UNTIL (WS-ESCAPE-FLAG = 1). 
    * 
    000000-EXIT. 
     STOP RUN. 
    * 
    *     P R O C E S S 
    * 
    000100-PROCESS. 
    * 
     ACCEPT INPUT-SCREEN 
      ON ESCAPE 
       MOVE 1 TO WS-ESCAPE-FLAG 
       GO TO 000100-EXIT. 
    * 
     PERFORM 003000-GET-NBR 
      THRU 003000-EXIT. 
    * 
     IF (NW-NBR-ERROR-FLAG = 1) 
      MOVE "NUMBER INVALID" TO WS-ERR-MSG 
     ELSE 
      MOVE SPACES   TO WS-ERR-MSG. 
    * 
     DISPLAY OUTPUT-SCREEN. 
    * 
    000100-EXIT. 
     EXIT. 
    * 
    COPY GETNUMP.COB. 

Я не COBOL программист, и из-за этого я не понял, что в этой грамматике не так.

Может ли кто-нибудь мне помочь?

ответ

3

Многие оценивают сложность построения соответствующего COBOL-компилятора или парсера. Это действительно сложно материал, много сложнее, чем для большинства других языков.

Я думаю, что основная проблема заключается в том, что используемая вами грамматика JavaCC подходит только для синтаксического анализа COBOL источника в фазе пост-манипуляции текстом.

Типичный компилятор COBOL имеет предварительный шаг, на котором обрабатываются комментарии и инструкции для управления компилятором, чтобы генерировать исходный текст, подходящий для последующего синтаксического анализа. Фаза «текстовых манипуляций» отключает линии комментариев, продолжается продолжение процессов строк, процессы COPY директивы и строят директивы компилятора для последующего компиляции.

Программа, которую вы пытаетесь разобрать, содержит строки комментариев (строки с «*» в столбце 7) и пару из COPY директивы. Пока вы не удалите эти данные или не скомпилируете предварительный компилятор для завершения фазы обработки текста компиляции, грамматика, которую вы используете, не будет очень полезна - за исключением самых простых программ.

Действительно плохая новость заключается в том, что я видел много грамматик COBOL, подходящих для фазы обработки текстовых сообщений , но практически ничего для ведения манипуляций с текстом не нужно, чтобы сделать их полезными!

Примечание: JavaCC грамматику содержит CommentLine(), но это для COBOL комментарий записей, которые являются устаревшими конструкциями кодирования, найденные в некоторых старых программах COBOL. Это не анализирует строку комментария COBOL (плохой выбор имени автором или этой грамматикой). Как отмечалось ранее, во время манипулирования текстом были удалены строки комментариев COBOL .

+0

. Я попытаюсь удалить комментарии, чтобы проверить, является ли AST заполнены. ТКС –

1

Кажется, что он борется с комментариями.
Операторы COBOL являются «Column Sensitive», хотя я не вижу, чтобы грамматика могла распознавать выравнивание столбцов.

  • комментарии должны быть * в колонке 7
  • деление и заголовки разделов начинаются в колонке 8, например, «ИДЕНТИФИКАЦИЯ DIVISION»
  • другие операторы начинают в колонке 12

Его странно, что сообщая об ошибке «[no filename] .cbl», заключается в том, что вы не сохранили файл, который разбирается в Eclipse?

Попробуйте выровнять столбцы и удалить комментарии.

+0

Tks для вашего ответа. Я видел, что эта грамматика, похоже, не обрабатывает позицию токенов =/[no filename] .cbl, потому что я просто копирую/вставляю исходный код в GUI PMD –

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

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