-
-
Save enghqii/2c4376508307fae8eaff to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
%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; } | |
%% |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
%{ | |
#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