grammar grammaire;
//PROGRAMM : PROGRAMM 'ident' VARDECLLIST FUNCDECLLIST INSTR;
PROGRAMM : '{'PROGRAMM'ident' VARDECLLIST FUNCDECLLIST INSTR'}';
VARDECLLIST : EOF| VARDECL ';' VARDECLLIST;
VARDECL : 'var' IDENTLIST ';' TYPENAME;
IDENTLIST : 'ident' | 'ident' ',' IDENTLIST;
TYPENAME : ATOMICTYPE | ARRAYTYPE;
ATOMICTYPE : 'unit' | 'bool'
| 'int';
ARRAYTYPE : 'array' '['RANGELIST']' 'of' ATOMICTYPE;
RANGELIST : 'int..int' |' int .. int,' RANGELIST;
FUNCDECLLIST : EOF| FUNCDECL ';' FUNCDECLLIST;
FUNCDECL : 'function ident ('ARGLIST') : 'ATOMICTYPE VARDECLLIST INSTR;
//ARGLIST : EOF| ARG
// | ARG ',' ARGLIST;
ARGLIST : ARG K;
K :','ARGLIST|EOF;
ARG : 'ident :' TYPENAME| 'ref ident :' TYPENAME;
//INSTR : 'if' EXPR 'then do 'INSTR
// | 'if' EXPR 'then do' INSTR ' else' INSTR
// | 'while' EXPR' do' INSTR
// | LVALUE' :='EXPR
// | 'return' EXPR
// | 'return'
// | 'ident ('EXPRLIST')'|'begin' SEQUENCE 'end' | 'begin end';
INSTR : 'if' EXPR 'then do 'INSTR SUITE
| 'while' EXPR' do' INSTR
| LVALUE' :='EXPR
| 'return' X
| 'ident ('EXPRLIST')'|'begin' SEQUENCE 'end' | 'begin end';
SUITE :EOF|' else' INSTR ;
X :EXPR|EOF;
//SEQUENCE : INSTR' ; 'SEQUENCE | INSTR ';'
// | INSTR;
SEQUENCE : INSTR SUIV;
SUIV : ';'SEQUENCE|';'|EOF;
LVALUE : 'ident' | 'ident ['EXPRLIST']';
//EXPRLIST : EXPR | EXPR ',' EXPRLIST;
EXPRLIST : EXPR T;
T :','EXPRLIST |EOF;
EXPR : 'cte' | '('EXPR')'
| R EXPR
| 'ident ('EXPRLIST')'
| 'ident ['EXPRLIST']';
R : 'opb'|'opu';
//EXPR : 'cte' |'('EXPR')'
// | EXPR 'opb' EXPR
// | 'opu' EXPR
// | 'ident ('EXPRLIST')'
// | 'ident ['EXPRLIST']'
('opb' EXPR)*
Partager