Skip to content

Instantly share code, notes, and snippets.

@libbkmz
Created February 24, 2013 07:29
Show Gist options
  • Select an option

  • Save libbkmz/5023020 to your computer and use it in GitHub Desktop.

Select an option

Save libbkmz/5023020 to your computer and use it in GitHub Desktop.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
grammar libbkmzgrammar;
options {
k=1; // Only 1 lookahead character required
}
tokens {
/*PLUS = '+' ;
MINUS = '-' ;
MULT = '*' ;
DIV = '/' ;*/
}
/*------------------------------------------------------------------
* PARSER RULES
*------------------------------------------------------------------*/
/*expr : term ( ( PLUS | MINUS ) term )* ;
term : factor ( ( MULT | DIV ) factor )* ;
factor : DIGIT ;*/
/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
/* TODO: Case insensetive!!! */
//KEYWORDS:
fragment VAR : 'var';
fragment IMPLEMENTATION
: 'implementation';
fragment INT_TYPE
: 'int';
fragment REAL_TYPE
: 'real';
fragment BREAK
: 'break';
fragment GOTO
: 'goto';
fragment READ
: 'read';
fragment WRITE
: 'write';
fragment SKIP
: 'skip';
fragment SPACE
: 'space';
fragment TAB
: 'tab';
fragment LOOP
: 'loop';
/*Идентификатор, буква и цифра*/
ID : CHAR (CHAR | DIGIT)*;
CHAR : ('a'..'z'|'A'..'Z');
DIGIT : ('0'..'9');
/* TODO: Comments!!! */
LABEL : LABEL_NAME ':';
LABEL_NAME
: UINT;
UINT : (BINARY|OCTAL|DECIMAL|HEX);
BINARY : '2#' ('0'|'1')+;
OCTAL : '8#' ('0'..'7')+;
DECIMAL : '10#'? (DIGIT)+;
HEX : '16#' (DIGIT|'a'..'z'|'A'..'Z')+;
NUMERIC_STR
: DIGIT+;
EXPONENT : ('E'|'e') ('+'|'-')? NUMERIC_STR;
REAL : (NUMERIC_STR EXPONENT)
| (NUMERIC_STR '.' NUMERIC_STR? EXPONENT?)
| ( '.' NUMERIC_STR EXPONENT?);
PROGRAM : (VAR DESCRIPTION (';' DESCRIPTION)* )? (IMPLEMENTATION PROCEDURE (';' PROCEDURE)* )?
('{' STATEMENT (';' STATEMENT)* '}');
MULTIPLY
: '{' STATEMENT (';' STATEMENT )* '}';
DESCRIPTION
: TYPE ID ('[' UINT ']')? (',' ID ('[' UINT ']')?)*;
TYPE : INT_TYPE|REAL_TYPE;
STATEMENT : LABEL? UNMARKED;
UNMARKED
: MULTIPLY|ASSIGNMENT|TRANSITION|CONDITIONAL|CYCLE|EMPTY|INPUT|OUTPUT|CALL|BREAK;
EMPTY : ;
TRANSITION : GOTO LABEL_NAME;
INPUT : READ VARIABLE (',' VARIABLE)*;
OUTPUT : WRITE (EXPRESSION|QUALIFIER) (',' (EXPRESSION|QUALIFIER) )*?;
VARIABLE : ID ('[' INDEX ']' )?;
INDEX : ID|UINT;
QUALIFIER : SKIP|SPACE|TAB;
ASSIGNMENT
: VARIABLE '=' VARIABLE;
EXPRESSION
: SUMMAND (('=='|'!='|'<'|'>'|'<='|'>=') SUMMAND)*;
SUMMAND : FACTOR (('+'|'-') FACTOR)*;
FACTOR : UNARY (('*'|'/'|'%') UNARY)*;
UNARY : '-'? TERM;
TERM : VARIABLE|NUMBER|('(' EXPRESSION ')');
NUMBER : UINT|REAL;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment