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