Untitled

mail@pastecode.io avatar
unknown
plain_text
14 days ago
1.7 kB
1
Indexable
Never
grammar ArithGrammer;
program : prog;

prog : func_list ;
 
func_list : func_def func_list
          | func_def
          ;

func_def : data_type ID '(' param_list ')' code_block
          ;

param_list : param ',' param_list
           | param
           | // epsilon
           ;

param : data_type ID ;

data_type : 'int' | 'double' | 'boolean' | 'void' ;

code_block : '{' stmt_list '}' ;

stmt_list : stmt stmt_list
          |
          ;

stmt : ';'
     | code_block
     | data_type var_list ';'
     | ID '=' expr ';'
     | ID '++' ';'
     | ID '--' ';'
     | 'return' ';'
     | 'return' expr ';'
     | decide '(' expr ')' stmt
     | decide '(' expr ')' stmt ('else' stmt)?
     | expr ';'
     | loop_stmt
     | init_stmt ';'
     ;  

decide : 'if';

loop_stmt : 'while' '(' expr ')' stmt
          ;

init_stmt : data_type ID '=' expr
          ;

var_list : var ',' var_list
         | var
         ;

var : ID
    |ID '=' expr
    ;

expr : number
     | ID
     | 'true'
     | 'false'
     | STRING
     | ID '(' args ')'
     | '(' expr ')' 
     |  unop number
     | number binop number 
     ;

args : expr ',' args
     | expr
     | 
     ;

unop : '-' 
     | '!' 
     ;

binop : ( '*' | '/' | '%' )
      | ( '+' | '-' )
      | ( '<' | '>' | '<=' | '>=' )
      | ( '==' | '!=' )
      | '&&'
      | '||'
      ;

number : INTEGER | DOUBLE  ;

// Lexer rules
INTEGER : '0' | [1-9] [0-9]*;
DOUBLE : INTEGER '.' ([0-9])+;
ID :  [a-zA-Z_] ([a-zA-Z_] | [0-9])*;

STRING : '"' .*? '"';
WS :  [ \t\r\n]+ -> skip;
COMMENT : '//' ~[\r\n]* -> skip;
BLOCK_COMMENT : '/*' .*? '*/' -> skip;

// Handle errors
ERROR : . -> channel(HIDDEN);
Leave a Comment