Skip to content

Instantly share code, notes, and snippets.

@enghqii
Created July 20, 2015 07:08
Show Gist options
  • Save enghqii/2c4376508307fae8eaff to your computer and use it in GitHub Desktop.
Save enghqii/2c4376508307fae8eaff to your computer and use it in GitHub Desktop.
%option noyywrap
%option yylineno
%{
//#include "sym.h"
#include "coma.tab.h"
%}
digit [0-9]
letter [a-zA-Z_]
delim [ \t]
line [\n]
ws {delim}+
%%
ws {}
line {}
";" { return SEMICOLON; }
var { return VAR; }
nil { return NIL; }
and { return AND; }
or { return OR; }
not { return NOT; }
"," { return COMMA; }
"." { return DOT; }
"+" { return ADD; }
"-" { return SUB; }
"*" { return MUL; }
"/" { return DIV; }
"%" { return MOD; }
"^" { return POW; }
"=" { return ASSIGN; }
"+=" { return ADDASSIGN; }
"-=" { return SUBASSIGN; }
"*=" { return MULASSIGN; }
"/=" { return DIVASSIGN; }
"%=" { return MODASSIGN; }
"^=" { return POWASSIGN; }
"++" { return DBLADD; }
"--" { return DBLSUB; }
"<" { return LSS; }
">" { return GTR; }
"<=" { return LEQ; }
">=" { return GEQ; }
"!=" { return NEQ; }
"==" { return EQL; }
"!" { return NOT; }
"(" { return LP; }
")" { return RP; }
"{" { return LR; }
"}" { return RR; }
"[" { return LB; }
"]" { return RB; }
procedure { return PROCEDURE; }
function { return FUNCTION; }
return { return RETURN; }
begin { return BEG; }
end { return END; }
if { return IF; }
then { return THEN; }
else { return ELSE; }
elseif { return ELSEIF; }
while { return WHILE; }
for { return FOR; }
in { return IN; }
break { return BREAK; }
continue { return CONTINUE; }
"true" { return TRUE; }
"false" { return FALSE; }
{letter}({letter}|{digit})* { return IDENTIFIER; }
\"(\\.|[^"])*\" { return STRLTR; }
\'.\' { return CHRLTR; }
{digit}+(\.{digit}+)* { return NUMLTR; }
%%
%{
#include <stdio.h>
#include <string.h>
extern char* yytext;
extern int yylineno;
void yyerror(const char *str)
{
fprintf(stderr,"error, %s: '%s' in line %d\n", str, yytext, yylineno);
}
%}
%start chunk
%token SEMICOLON VAR NIL AND OR COMMA DOT ADD SUB DIV MUL MOD POW
%token ADDASSIGN SUBASSIGN DIVASSIGN MULASSIGN MODASSIGN POWASSIGN DBLADD DBLSUB LSS GTR LEQ GEQ NEQ EQL NOT ASSIGN
%token LP RP LR RR LB RB BEG END IF THEN ELSE ELSEIF FOR WHILE IN BREAK CONTINUE
%token PROCEDURE FUNCTION RETURN IDENTIFIER NUMLTR CHRLTR STRLTR TRUE FALSE
%%
chunk:
stmts
;
stmts:
stmt |
stmt stmts
;
stmt:
SEMICOLON |
block |
function_decl |
procedure_decl |
return_stmt |
if_stmt |
while_stmt |
for_stmt |
assign_stmt
;
block:
BEG stmts END
;
function_decl:
FUNCTION IDENTIFIER LP RP block |
FUNCTION IDENTIFIER block
;
procedure_decl:
PROCEDURE IDENTIFIER LP RP block |
PROCEDURE IDENTIFIER block
;
return_stmt:
RETURN SEMICOLON |
RETURN expr_list SEMICOLON
;
while_stmt:
WHILE expr block
;
for_stmt:
FOR IDENTIFIER ASSIGN expr COMMA expr COMMA expr block
;
if_stmt:
IF expr THEN stmt END |
IF expr THEN stmt else_stmt END |
IF expr THEN stmt elseif_stmt END
;
else_stmt:
ELSE stmt
;
elseif_stmt:
ELSEIF expr THEN stmt |
ELSEIF expr THEN stmt elseif_stmt |
ELSEIF expr THEN stmt else_stmt
;
expr:
or_expr
;
or_expr:
or_expr OR and_expr |
and_expr
;
and_expr:
and_expr AND cmp_expr |
cmp_expr
;
cmp_expr:
cmp_expr LSS add_expr |
cmp_expr GTR add_expr |
cmp_expr LEQ add_expr |
cmp_expr GEQ add_expr |
cmp_expr NEQ add_expr |
cmp_expr EQL add_expr |
add_expr
;
add_expr:
add_expr ADD mul_expr |
add_expr SUB mul_expr |
mul_expr
;
mul_expr:
mul_expr MUL not_expr |
mul_expr DIV not_expr |
mul_expr MOD not_expr |
not_expr
;
not_expr:
not_expr NOT pow_expr |
SUB pow_expr |
pow_expr
;
pow_expr:
factor POW pow_expr |
factor
;
factor:
NIL |
FALSE |
TRUE |
STRLTR |
NUMLTR |
var |
LP expr RP
;
expr_list:
expr |
expr COMMA expr_list
;
var_list:
var |
var COMMA var_list
;
var:
IDENTIFIER |
var LB expr RB |
var DOT
;
assign_stmt:
var_list ASSIGN expr_list SEMICOLON
;
%%
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment