为什么antlr不能匹配整数值

why can't antlr match the integer value

我查看了语法,一切似乎都很好,而且生成的解析树也没有任何错误,但提到的代码给出了错误。当使用具有数字操作或具有硬编码数字输入的变量的不同 COBOL 代码时,也会出现同样的错误。我使用 COBOL.g4 作为我的语法并且

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);

是我的js代码,其中 var tree = parser.startRule(); 给出以下错误

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'

代码

            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.

错误“行 24:56 不匹配的输入 '12345' 期望 {ABORT, AS, ASCII ...”并不意味着 12345 未被识别,但令牌之后这是出乎意料的。 12345 被正确标记为 INTEGERLITERAL 标记:

我尝试 运行 使用您的示例输入生成的解析器,但这根本没有引发任何错误。所以一定是JS运行时的问题(或者你改了.g4语法,导致了这个错误)。

这是我得到的解析树:

使用 Java 和 ANTLR 4.9.2 测试