Grammar.g4 (Antlr)
Fichero de Antlr que contiene la especificación sintáctica de MLang y crea el AST.
g4
grammar Grammar;
import Tokenizer;
@header {
import ast.*;
import ast.type.*;
import ast.statement.*;
import ast.expression.*;
}
program returns[Program ast]
: 'DATA' varDefinitions 'CODE' statements EOF { $ast = new Program($varDefinitions.list, $statements.list); }
;
varDefinitions returns[List<VarDefinition> list = new ArrayList<VarDefinition>()]
: (varDefinition { $list.add($varDefinition.ast); })*
;
statements returns[List<Statement> list = new ArrayList<Statement>()]
: (statement { $list.add($statement.ast); })*
;
varDefinition returns[VarDefinition ast]
: type IDENT ';' { $ast = new VarDefinition($type.ast, $IDENT); }
;
type returns[Type ast]
: 'int' { $ast = new IntType(); }
| 'float' { $ast = new FloatType(); }
;
statement returns[Statement ast]
: 'print' expression ';' { $ast = new Print($expression.ast); }
| left=expression '=' right=expression ';' { $ast = new Assignment($left.ast, $right.ast); }
;
expression returns[Expression ast]
: left=expression op=('*' | '/') right=expression { $ast = new Arithmetic($left.ast, $op, $right.ast); }
| left=expression op=('+' | '-') right=expression { $ast = new Arithmetic($left.ast, $op, $right.ast); }
| '(' expression ')' { $ast = $expression.ast; }
| IDENT { $ast = new Variable($IDENT); }
| INT_LITERAL { $ast = new IntLiteral($INT_LITERAL); }
| FLOAT_LITERAL { $ast = new FloatLiteral($FLOAT_LITERAL); }
;