Skip to content

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