Skip to content

Instantly share code, notes, and snippets.

@CassianoSF
Last active July 27, 2019 13:21
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CassianoSF/ac9d80424ac746e2b110a2491f64de94 to your computer and use it in GitHub Desktop.
Save CassianoSF/ac9d80424ac746e2b110a2491f64de94 to your computer and use it in GitHub Desktop.
javacc MIPS syntactic analyzer
all:
javacc *.jj
javac *.java
clean:
rm -f *.java *.class
// ---------------------------------------------------------
// MIPS syntactic analyser
// ---------------------------------------------------------
options {
STATIC = false;
}
PARSER_BEGIN(Somador)
class Somador {
static public void main( String[] args )
throws ParseException, TokenMgrError {
/* Estas classes serao geradas pelo JavaCC */
Somador parser = new Somador( System.in ) ;
parser.Start();
}
}
PARSER_END(Somador)
// ---------------------------------------------------------
// Lexico
// ---------------------------------------------------------
SKIP : { " " | "\t" | "\r" | "\n" | "\r\n" }
SKIP : {< "#" (~["\n"])* > }
TOKEN : { < T_MOVE : "move " >}
TOKEN : { < T_ADD : "add " >}
TOKEN : { < T_ADDU : "addu " >}
TOKEN : { < T_SUBU : "subu " >}
TOKEN : { < T_LOAD_IMMEDIATE : "li " >}
TOKEN : { < T_LOAD_ADDRESS : "la " >}
TOKEN : { < T_LOAD_WORD : "lw " >}
TOKEN : { < T_STORE_WORD : "sw " >}
TOKEN : { < T_JUMP : "j " >}
TOKEN : { < T_MULT : "mult " >}
TOKEN : { < T_MFLO : "mflo " >}
TOKEN : { < T_MFHI : "mfhi " >}
TOKEN : { < T_DIV : "div " >}
TOKEN : { < T_SYSCALL : "syscall" >}
TOKEN : { < LETTER : ["a"-"z", "A"-"Z"] >}
TOKEN : { < DIGIT : ["0"-"9"] >}
TOKEN : { < LABEL : <LETTER>(<LETTER>|<DIGIT>)* >}
TOKEN : { < INT_NUM : (["+", "-"])* (["0"-"9"])+ >}
TOKEN : { < ASPAS : "\"" > }
TOKEN : { < STR : "\""(~["\"","\n","\r"])* "\"">}
TOKEN : { < T_DATA_DIRECTIVE :".data" >}
TOKEN : { < T_SPACE_DIRECTIVE :".space" >}
TOKEN : { < T_BYTE_DIRECTIVE :".byte" >}
TOKEN : { < T_HALF_DIRECTIVE :".half" >}
TOKEN : { < T_WORD_DIRECTIVE :".word" >}
TOKEN : { < T_ASCIIZ_DIRECTIVE :".asciiz" >}
TOKEN : { < T_TEXT_DIRECTIVE :".text" >}
TOKEN : { < T_GLOBL_DIRECTIVE :".globl" >}
TOKEN : { < T_REG : "$zero" | "$at" | "$v0" | "$v1" | "$a0" | "$a1" | "$a2" | "$a3" | "$t0" | "$t1" | "$t2" | "$t3" | "$t4" | "$t5" | "$t6" | "$t7" | "$s0" | "$s1" | "$s2" | "$s3" | "$s4" | "$s5" | "$s6" | "$s7" | "$t8" | "$t9" | "$k0" | "$k1" | "$gp" | "$sp" | "$fp" | "$ra">}
TOKEN : { < T_COLON : ":" >}
TOKEN : { < T_COMMA : "," >}
TOKEN : { < T_LB :"(" >}
TOKEN : { < T_RB : ")" >}
// EOF : Retornado pelo implicitamente
// ---------------------------------------------------------
// Sintatico
// ---------------------------------------------------------
void Start() : {
}
{
(Expressao() <EOF> )* <EOF>
}
void Expressao():{
}
{
<T_DATA_DIRECTIVE>
(<LABEL><T_COLON> (<T_SPACE_DIRECTIVE><INT_NUM> | <T_ASCIIZ_DIRECTIVE><STR>))*
<T_TEXT_DIRECTIVE>
(<LABEL><T_COLON>
(
(<T_MOVE> <T_REG><T_COMMA><T_REG>)
|(<T_ADD> <T_REG><T_COMMA><T_REG><T_COMMA><T_REG>)
|(<T_ADDU> <T_REG><T_COMMA><T_REG>)
|(<T_DIV> <T_REG><T_COMMA><T_REG>)
|(<T_SUBU> <T_REG><T_COMMA><T_REG>)
|(<T_LOAD_IMMEDIATE> <T_REG><T_COMMA>(<INT_NUM>| <DIGIT>))
|(<T_LOAD_ADDRESS> <T_REG><T_COMMA><LABEL>)
|(<T_LOAD_WORD> <T_REG><T_COMMA>(<INT_NUM>| <DIGIT>)<T_LB><T_REG><T_RB>)
|(<T_STORE_WORD> <T_REG><T_COMMA>(<INT_NUM>| <DIGIT>)<T_LB><T_REG><T_RB>)
|(<T_JUMP> <T_REG><T_COMMA><T_REG>)
|(<T_MULT> <T_REG><T_COMMA><T_REG>)
|(<T_MFLO> <T_REG>)
|(<T_MFHI> <T_REG>)
|(<T_SYSCALL>)
)*
)*
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment