ANTLR4:输入错误时没有可行的替代方案

ANTLR4:输入错误时没有可行的替代方案,antlr,pascal,antlr4,Antlr,Pascal,Antlr4,我正在使用一个精简版的pascal语法来创建一个将pascal转换为javascript的编译器,但是我一直遇到这个错误 line 3:4 no viable alternative at input 'PROCEDURE' line 3:38 extraneous input ':' expecting {'END', ';'} line 5:4 no viable alternative at input 'VAR' 以下是我语法的相关部分: grammar pascal; progra

我正在使用一个精简版的pascal语法来创建一个将pascal转换为javascript的编译器,但是我一直遇到这个错误

line 3:4 no viable alternative at input 'PROCEDURE'
line 3:38 extraneous input ':' expecting {'END', ';'}
line 5:4 no viable alternative at input 'VAR'
以下是我语法的相关部分:

grammar pascal;

program
: programHeading ('INTERFACE')?
  block
  DOT
;

programHeading
: 'PROGRAM' identifier (LPAREN identifierList RPAREN)? SEMI
| 'UNIT' identifier SEMI
;

identifier
: IDENT
;

block
: ( labelDeclarationPart
  | constantDefinitionPart
  | typeDefinitionPart
  | variableDeclarationPart
  | procedureAndFunctionDeclarationPart
  | usesUnitsPart
  | 'IMPLEMENTATION'
  )*
   | compoundStatement
;
procedureAndFunctionDeclarationPart
: procedureOrFunctionDeclaration SEMI
;

procedureOrFunctionDeclaration
: procedureDeclaration
| functionDeclaration
;

procedureDeclaration
: 'PROCEDURE'  identifier (formalParameterList)? SEMI
  ( block | directive )
;

functionDeclaration
: 'FUNCTION' identifier (formalParameterList)? COLON resultType SEMI
  ( block | directive )
;

compoundStatement
: 'BEGIN'
statements
  'END'
;

statements
: statement ( SEMI statement )*
;

statement
: label COLON unlabelledStatement
| unlabelledStatement
;
我正在使用antlr-4.5-complete,希望有人能对此有所了解

这是我试图编译的程序:

PROGRAM Lesson1_PROGRAM3;
BEGIN
PROCEDURE DrawLine(X : Integer; Y : Integer);

VAR
    Num1, Num2, Sum : Integer;

BEGIN
    Write('Input number 1:');
    Readln(Num1);
    Writeln('Input number 2:');
    Readln(Num2);
    Sum := Num1 + Num2;
    Writeln(Sum);
    Readln;

    IF Sel = '1' THEN
    BEGIN
        Total := N1 + N2;
        Write('Press any key TO continue...');
        Readkey;
        GOTO 1;
    END;

    FOR Counter := 1 TO 7 DO
        writeln('for loop');
    Readln;
END;
END.

第二行的开始是一个复合语句。因此,该过程是语句规则的开始。您的语句规则在语法中不存在,但我认为您不会返回到从语句声明的过程。是否从有效的pascal程序开始测试?这个不是。@MarcovandeVoort你能告诉我这个程序有什么问题吗?有人给了我,告诉我valid@Mephy好的,我添加了语句规则,你能详细说明一下吗?@Antlr语法仍然不完整,但错误似乎是BEGIN过程不是语法描述的语言中的有效字符串。尝试找到一种手动派生它的方法,您将看到。