Vipar is a LALR(1) lexer and parser for a context-free grammar generating a Python-like language, written in Java.
Upper case used for non-terminals, lower case for terminals. (WARNING: Its quite long...)
S -> PROGRAM
PROGRAM -> PREMAINDECLARATIONS MAINFUNC {FUNC}
PREMAINDECLARATIONS -> DECLARATION ';' PREMAINDECLARATIONS | ϵ
MAINFUNC -> func main '(' ')' '{' STMTLIST '}'
STMTLIST -> STMT STMTLIST | ϵ
STMT -> CONDITIONAL | LOOP | DECLARATION | ASSIGNMENT | FUNCCALL
CONDITIONAL -> IF | SWITCH
IF -> if '(' CONDITION ')' '{' STMTLIST '}' {ELSEIFS} [ELSE]
ELSE -> else '{' STMTLIST '}'
ELSEIFS -> elif '(' CONDITION ')' '{' STMTLIST '}'
SWITCH -> switch '(' EXPR ')' '{' {CASE} '}'
CASE -> case EXPR '{' STMTLIST '}'
LOOP -> FORLOOP | WHILELOOP
FORLOOP -> for variable in variable LOOPOP variable [STEP] '{' STMTLIST '}'
LOOPOP -> ... | ..<
STEP -> step variable
WHILELOOP -> while '(' CONDITION ')' '{' STMTLIST '}'
DECLARATION -> var VARDECLLIST
VARDECLLIST -> variable : VARTYPE OPTASSIGNRHS {MOREDECLS}
MOREDECLS -> , variable : VARTYPE [ASSIGNRHS]
OPTASSIGNRHS -> = ASSIGNRHS
ASSIGNMENT -> variable = ASSIGNRHS
ASSIGNRHS -> EXPR
ASSIGNRHS -> EXPR if CONDITION else EXPR
FUNCCALL -> FUNCCALLRHS
FUNCCALLRHS -> variable ( [ACTPARAMLIST] )
ACTPARAMLIST -> VAROREXP {MOREPARAMS}
MOREPARAMS -> , VAROREXP
VAROREXP -> EXPR
FUNC -> func variable ( [FUNCPARAMS] ) arrow RETTYPE { FUNCSTMT }
FUNCSTMT -> STMTLIST [RETURN]
OPTRETURN -> return EXPR ;
FUNCPARAMS -> variable : VARTYPE {MOREFUNCPARAMS}
MOREFUNCPARAMS -> , variable : VARTYPE
RETTYPE -> VARTYPE | void
CONDITION -> [!] SCONDITION [(&& | ||) SCONDITION]
SCONDITION -> EXPR RELOP EXPR | ( CONDITION )
RELOP -> < | < | <= | >= | == | !=
EXPR -> SUBEXPR [(+ | - | * | / | ^ | % | & | |) SUBEXPR]
SUBEXPR -> variable | ( EXPR ) | FUNCCALLRHS
VARTYPE -> int | real | string
Here's the corresponding BNF Grammar (Psst... Its even longer!) and the parse table (this is the biggest!)
Write some code and change the file name in the Runner class (extension doesn't really matter, but its cool to have your "own extension" :D). We've provided some sample valid code in code0.vipar, code1.vipar and code2.vipar
A beautiful parse tree is created in the outputs folder. The green leaves are the terminals which are actually part of the code. The red leaves expand to the null string. Feel free to open the .html files we've included for our sample code!