Search code examples
javascriptantlrantlr4cobol

why can't antlr match the integer value


I have looked into the grammar and everything seems to be fine there and the parse-tree also generates without any errors but the mentioned codes give errors. This same error also appears when working with different COBOL code which has number operations or had a variable has hardcoded number input. I am using COBOL.g4 as my grammar and

import antlr4 from 'antlr4';
import fs from 'fs'
import HelloLexer from "./gen/CobolLexer.js";
import HelloParser from "./gen/CobolParser.js";
import CustomCobolListener from "./CustomCobolListener.js"

const {CommonTokenStream, InputStream} = antlr4;

createServer((req, res) => {
    res.writeHead(200, {"Content-Type": "text/json"});
    // res.write('<html><head><meta charset="UTF-8"/></head></head>');
    var InputFromFile = '';
    try {
        let data = fs.readFileSync('./example.cbl', 'utf8');
        InputFromFile = data;
    } catch (e) {
        console.log(e);
    }
    console.log("server running");
    try {
        var chars = new InputStream(InputFromFile, true);
        var lexer = new HelloLexer(chars);
        var tokens = new CommonTokenStream(lexer);
        var parser = new HelloParser(tokens);
        parser.buildParseTrees = true;
        console.log("Walker Startes now");
        var tree = parser.startRule();
        var htmlChat = new CustomCobolListener(res);
        antlr4.tree.ParseTreeWalker.DEFAULT.walk(htmlChat, tree);
    }catch (e) {
        // console.log(e)
    }
    // res.write("</body></html>");
    res.end();
}).listen(1337);

is my js code in which var tree = parser.startRule(); gives the following error

line 24:56 mismatched input '12345' expecting {ABORT, AS, ASCII, ASSOCIATED_DATA,
 ASSOCIATED_DATA_LENGTH, ATTRIBUTE, AUTO, AUTO_SKIP, BACKGROUND_COLOR, BACKGROUND_COLOUR,
 BEEP, BELL, BINARY, BIT, BLINK, BLOB, BOUNDS, CAPABLE, CCSVERSION, CHANGED, CHANNEL,
 CLOB, CLOSE_DISPOSITION, COBOL, COMMITMENT, CONTROL_POINT, CONVENTION, CRUNCH, CURSOR,
 DBCLOB, DEFAULT, DEFAULT_DISPLAY, DEFINITION, DFHRESP, DFHVALUE, DISK, DONTCARE, DOUBLE, 
EBCDIC, EMPTY_CHECK, ENTER, ENTRY_PROCEDURE, ERASE, EOL, EOS, ESCAPE, EVENT, EXCLUSIVE, 
EXPORT, EXTENDED, FOREGROUND_COLOR, FOREGROUND_COLOUR, FULL, FUNCTIONNAME, 
FUNCTION_POINTER, GRID, HIGHLIGHT, IMPLICIT, IMPORT, INTEGER, KANJI, KEPT, KEYBOARD, 
LANGUAGE, LB, LD, LEFTLINE, LENGTH_CHECK, LIBACCESS, LIBPARAMETER, LIBRARY, LIST, LOCAL, 
LOCK, LONG_DATE, LONG_TIME, LOWER, LOWLIGHT, MMDDYYYY, NAMED, NATIONAL, NATIONAL_EDITED, 
NETWORK, NO_ECHO, NUMERIC_DATE, NUMERIC_TIME, OCCURS, ODT, ORDERLY, OVERLINE, OWN, 
PASSWORD, PORT, PRINTER, PRIVATE, PROCESS, PROGRAM, PROMPT, READER, REMOTE, REAL, 
RECEIVED, RECURSIVE, REF, REMOVE, REQUIRED, REVERSE_VIDEO, SAVE, SECURE, SHARED, 
SHAREDBYALL, SHAREDBYRUNUNIT, SHARING, SHORT_DATE, SQL, SYMBOL, TASK, THREAD, 
THREAD_LOCAL, TIMER, TODAYS_DATE, TODAYS_NAME, TRUNCATED, TYPEDEF, UNDERLINE, VIRTUAL, 
WAIT, YEAR, YYYYMMDD, YYYYDDD, ZERO_FILL, '66', '77', '88', INTEGERLITERAL, 
NUMERICLITERAL, IDENTIFIER}

line 25:18 missing {ABORT, AS, ASCII, ASSOCIATED_DATA, ASSOCIATED_DATA_LENGTH, ATTRIBUTE,
 AUTO, AUTO_SKIP, BACKGROUND_COLOR, BACKGROUND_COLOUR, BEEP, BELL, BINARY, BIT, BLINK, 
BLOB, BOUNDS, CAPABLE, CCSVERSION, CHANGED, CHANNEL, CLOB, CLOSE_DISPOSITION, COBOL, 
COMMITMENT, CONTROL_POINT, CONVENTION, CRUNCH, CURSOR, DBCLOB, DEFAULT, DEFAULT_DISPLAY,
 DEFINITION, DFHRESP, DFHVALUE, DISK, DONTCARE, DOUBLE, EBCDIC, EMPTY_CHECK, ENTER, 
ENTRY_PROCEDURE, ERASE, EOL, EOS, ESCAPE, EVENT, EXCLUSIVE, EXPORT, EXTENDED, 
FOREGROUND_COLOR, FOREGROUND_COLOUR, FULL, FUNCTIONNAME, FUNCTION_POINTER, GRID, 
HIGHLIGHT, IMPLICIT, IMPORT, INTEGER, KANJI, KEPT, KEYBOARD, LANGUAGE, LB, LD, LEFTLINE,
 LENGTH_CHECK, LIBACCESS, LIBPARAMETER, LIBRARY, LIST, LOCAL, LOCK, LONG_DATE, LONG_TIME,
 LOWER, LOWLIGHT, MMDDYYYY, NAMED, NATIONAL, NATIONAL_EDITED, NETWORK, NO_ECHO, 
NUMERIC_DATE, NUMERIC_TIME, OCCURS, ODT, ORDERLY, OVERLINE, OWN, PASSWORD, PORT, PRINTER,
 PRIVATE, PROCESS, PROGRAM, PROMPT, READER, REMOTE, REAL, RECEIVED, RECURSIVE, REF, 
REMOVE, REQUIRED, REVERSE_VIDEO, SAVE, SECURE, SHARED, SHAREDBYALL, SHAREDBYRUNUNIT, 
SHARING, SHORT_DATE, SQL, SYMBOL, TASK, THREAD, THREAD_LOCAL, TIMER, TODAYS_DATE, 
TODAYS_NAME, TRUNCATED, TYPEDEF, UNDERLINE, VIRTUAL, WAIT, YEAR, YYYYMMDD, YYYYDDD,
 ZERO_FILL, '66', '77', '88', INTEGERLITERAL, NUMERICLITERAL, IDENTIFIER} at '5'

for code

            IDENTIFICATION DIVISION.
            PROGRAM-ID. VERBS.
            DATA DIVISION.
              WORKING-STORAGE SECTION.
              01 NUM1 PIC 9(9) VALUE 10.
              01 NUM2 PIC 9(9) VALUE 10.
              01 NUMA PIC 9(9) VALUE 100.
              01 NUMB PIC 9(9) VALUE 15.
              01 NUMC PIC 9(9).
              01 RES-DIV PIC 9(9).
              01 RES-MULT PIC 9(9).
              01 RES-SUB PIC 9(9).
              01 RES-ADD PIC 9(9).
              01 RES-LOL PIC 9(9).
              01 RES-MOV PIC X(9).
            PROCEDURE DIVISION.
              COMPUTE NUMC = (NUM1 * NUM2).
              DIVIDE NUMA BY NUMB GIVING RES-DIV.
              MULTIPLY NUMA BY NUMB GIVING RES-MULT.
              SUBTRACT NUMA FROM NUMB GIVING RES-SUB.
              ADD NUMA TO NUMB GIVING RES-ADD.
              MOVE NUMA TO RES-MOV.
              INITIALIZE NUM1.
              INITIALIZE NUM2 REPLACING NUMERIC DATA BY 12345.
              ADD 5 TO NUM2 GIVING RES-LOL.
              DISPLAY "NUMC:"NUMC
              DISPLAY "RES-LOL:"RES-LOL
              DISPLAY "RES-DIV:"RES-DIV
              DISPLAY "RES-MULT:"RES-MULT
              DISPLAY "RES-SUB:"RES-SUB
              DISPLAY "RES-ADD:"RES-ADD
              DISPLAY "RES-MOV:"RES-MOV
              DISPLAY "REINITIALIZED NUM1: "NUM1
              DISPLAY "REINITIALIZED NUM2: "NUM2
              STOP RUN.

Solution

  • The error "line 24:56 mismatched input '12345' expecting {ABORT, AS, ASCII ..." does not mean 12345 isn't recognized, but the token(s) after it are unexpected. The 12345 is properly tokenised as a INTEGERLITERAL token:

    enter image description here

    I tried running the generated parser with your example input, but that did not throw any error at all. So it must be an issue with the JS runtime (or you changed the .g4 grammar, which caused the error).

    This is the parse tree I got:

    enter image description here

    Tested with Java and ANTLR 4.9.2