summaryrefslogtreecommitdiff
path: root/src/svm/SVM.g4
blob: c913b87dd72a7c7ba0b07f70ea03d1b8187bdddc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
grammar SVM;

@header {
import java.util.HashMap;
}

@lexer::members {
public int lexicalErrors=0;
}

/*------------------------------------------------------------------
 * PARSER RULES
 *------------------------------------------------------------------*/
  
assembly: (instruction)* ;

instruction:
    ( 	LOAD REG NUMBER '(' REG ')' 	// = memory[NUMBER + REGright] <- REGleft  ## NEVER USED! WHY?
    	| STORE REG NUMBER '(' REG ')'	// = REGleft <- memory[NUMBER + REGright]
    	| STOREI REG NUMBER				// = REG <- NUMBER 
    	| MOVE REG REG					// = REGleft <- REGright
    	| ADD REG REG					// = top <- REGleft + REGright
    	| ADDI REG NUMBER				// = top <- REGleft + NUMBER
    	| SUB REG REG 					// = top <- REGleft - REGright
    	| SUBI REG NUMBER    			// = top <- REGleft - NUMBER
    	| MUL REG REG					// = top <- REGleft * REGright
    	| MULI REG NUMBER				// = top <- REGleft * NUMBER
    	| DIV REG REG					// = top <- REGleft / REGright
    	| DIVI REG NUMBER				// = top <- REGleft / NUMBER
    	| PUSH (n=NUMBER | l=LABEL)		// = memory[sp] = number|label , sp = sp-1
    	| PUSHR REG						// = memory[sp] = REG , sp = sp-1
    	| POP							// = sp = sp+1
    	| POPR REG 						// = REG <- memory[sp+1] == STORE REG 0($sp)
    	| BRANCH LABEL					// = ip = LABEL
    	| BRANCHEQ REG REG LABEL		// = if REGleft == REGright => ip = LABEL
    	| BRANCHLESSEQ REG REG LABEL 	// = if REGleft <= REGright => ip = LABEL
    	| JUMPSUB LABEL
    	| RETURNSUB REG
    	| l=LABEL ':'
 	  	| HALT
	  ) ;
 	 
/*------------------------------------------------------------------
 * LEXER RULES
 *------------------------------------------------------------------*/
 
LOAD  	 : 'load' 	; 	
STORE	 : 'store' 	; 	
STOREI	 : 'storei' ;  	
MOVE	 : 'move' 	;
ADD  	 : 'add'  	;
ADDI  	 : 'addi'  	;
SUB	 	 : 'sub' 	;	
SUBI	 : 'subi' 	;	
MUL	 	 : 'mul' 	;  	
MULI	 : 'muli' 	;
DIV	 	 : 'div' 	;
DIVI 	 : 'divi' 	;
PUSH	 : 'push' 	;
PUSHR	 : 'pushr'	;
POP	 	 : 'pop' 	;
POPR	 : 'popr' 	;
BRANCH 	 : 'b' 		;
BRANCHEQ :'beq' 	;
BRANCHLESSEQ:'bleq' ;
JUMPSUB	 : 'jsub' 	;
RETURNSUB: 'rsub'	;
HALT	 : 'halt' ;	

REG 	 : 'A0' | 'RA' | 'FP' | 'SP' | 'AL' | 'T1' | 'T2' ;
LABEL	 : ('a'..'z'|'A'..'Z')('a'..'z' | 'A'..'Z' | '0'..'9')* ;
NUMBER	 : '0' | ('-')?(('1'..'9')('0'..'9')*) ;


WHITESP  : ( '\t' | ' ' | '\r' | '\n' )+   -> channel(HIDDEN);
LINECOMENTS    : '//' (~('\n'|'\r'))* -> skip;

ERR   	 : . { System.err.println("Invalid char: "+ getText()); lexicalErrors++;  } -> channel(HIDDEN);