Реализуйте IF Else для, в то время как l oop и логическое утверждение в Antr - PullRequest
0 голосов
/ 14 апреля 2020

Я новичок в ANTLR и пытаюсь реализовать if-else, for, пока l oop и логический символ, но я не в состоянии это сделать. Кто-нибудь может мне с этим помочь? Ниже приведено то, что я сделал.

grammar BasForCCAL;
@header {
package basforccal;
import java.util.HashMap;
import java.util.Scanner;
}
@lexer::header{
package basforccal;
}
@members{
        String programName;
        HashMap memory = new HashMap();
        public void checkName(String endName){
            if(!endName.equals(programName)){
            System.out.println("Wrong Program name in end of the program");
            }
        }
}
program : start programbody end;
start   :'PROGRAM' ID {programName = $ID.text ; System.out.println("Checking program :"+$ID.text);};
programbody
    :   (devcar|ID'='(expr|CHAR)| ctrlStmt)*;
devcar  :   initInt var1|
            intFloat var1|
            intChar var1 ;
initInt :   'INT'
     ;
intFloat
    :   'FLOAT'
    ;
intChar:     'CHAR';  
var1    : idname (',' var1)* ;
idname  :    ID {Integer v = (Integer)memory.get($ID.text);
                if(v!=null) 
                    {System.err.println("Error: "+$ID.text+" already defined line:"+$ID.getLine());}
                else
                    {memory.put($ID.text,new Integer('1'));}
                 }
    ;
expr 
    :   (multExpr |'('expr')')
    (   '+' multExpr 
    |   '-' multExpr 
    |   '/' multExpr 
    |   '*' multExpr
    )*
    ;

logiExpr
    :   expr relOpr expr;

relOpr 
    :      '<' 
    |       '>' 
    |       '<>' 
    |       '<=' 
    |       '>=' 
    ;
ctrlStmt
    :   'IF''('logiExpr')' 'THEN' (stat)+ 'ENDIF' 
    |       'WHILE''('logiExpr')' 'DO' (stat)+ 'ENDDO' 
    |       'FOR' ID '=' expr  'TO' expr 'LOOP' stat+ 'ENDLOOP';
stat
    :   ctrlStmt|multExpr
        |   ID '=' (expr|CHAR);
multExpr 
    :    ID  {
    Integer v = (Integer)memory.get($ID.text);
    if ( v!=null ){}
    else System.err.println("undefined variable "+$ID.text);
    }
    |    INT
    |    FLOAT
    ; 
end
    : 'END' ID '.' {checkName($ID.text);};

Мой Java код для проверки.

import org.antlr.runtime.ANTLRFileStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RecognitionException;
import java.io.IOException;
public class AntlrParser {
    public static  void main(String args[]) throws IOException, RecognitionException {
    basforccal.BasForCCALLexer lexer = new basforccal.BasForCCALLexer(new ANTLRFileStream(args[0]));
    CommonTokenStream token = new CommonTokenStream(lexer);
    basforccal.BasForCCALParser parser = new basforccal.BasForCCALParser(token);
    parser.program();
    }
}

Ниже приведена программа в файле (prog1.bf cc), которая Я пытаюсь проверить, используя мой Java код.

PROGRAM TESTIF
FLOAT   A,B,C
A=1.0
C=1.0
IF(A>1.0)THEN
    B=2.0
ENDIF
IF(B*C<=10)THEN
    IF(A>0.0)THEN
       C=5.0
    ENDIF
ENDIF=
IF(3=4)THEN
    A=1.0
    B=2.0
    C=3.0
ENDIF
END TESTIF.

Ниже приведена ошибка, которую я получаю при проверке с JAVA.

Checking program :TESTIF
C:\Users\vivek\IdeaProjects\BasForCCal\prog1.bfcc line 16:4 mismatched input '=' expecting set null
Process finished with exit code 0

1 Ответ

0 голосов
/ 15 апреля 2020

У вас есть ENDIF= на вашем входе, что выглядит подозрительно. Вероятно, должно быть: ENDIF без =. Это то, что пытается сообщить вам сообщение об ошибке.

Кроме того, на вашем входе есть IF(3=4)THEN, но ваш relOpr не включает оператор =. Вы, вероятно, должны добавить это к этому:

relOpr
    :       '='
    |       '<'
    |       '>'
    |       '<>'
    |       '<='
    |       '>='
    ;
...