summaryrefslogtreecommitdiff
path: root/src/svm/SVM.g4
diff options
context:
space:
mode:
Diffstat (limited to 'src/svm/SVM.g4')
-rwxr-xr-xsrc/svm/SVM.g479
1 files changed, 79 insertions, 0 deletions
diff --git a/src/svm/SVM.g4 b/src/svm/SVM.g4
new file mode 100755
index 0000000..c913b87
--- /dev/null
+++ b/src/svm/SVM.g4
@@ -0,0 +1,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);
+