java compiler/Compiler1.javajava compiler/Compiler1.java
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CharStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.TokenStream;
publicclassTest1{
publicstaticvoid main(String[] args)throwsRecognitionExceptio
n{
CharStream stream =
newANTLRStringStream("program XLSample1 =rn"+
"/*rn"+
" constant one : Integer := 1;rn"+
" constant two : Integer := 2 * 3;rn"+
" var x, y, z : Integer := 42;rn"+
"*/rn"+
"rn"+
" procedure foo() =rn"+
" var x : Integer := 2;rn"+
" beginrn"+
" end foo.rn"+
" procedure fee(y : Integer) =rn"+
" var x : Integer := 2;rn"+
" beginrn"+
" end fee.rn"+
" function fie(y : Integer) : Integer =rn"+
" var x : Integer := 2;rn"+
" beginrn"+
" return y;rn"+
" end fie.rn"+
"beginrn"+
"end XLSample1.");
SampleLexer lexer =newSampleLexer(stream);
TokenStream tokenStream =newCommonTokenStream(lexer);
SampleParser parser =newSampleParser(tokenStream);
parser.program();
System.out.println("ok");
}
}
java compiler/Compiler2.javajava compiler/Compiler2.java
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CharStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.TokenStream;
publicclassTest2{
publicstaticvoid main(String[] args)throwsRecognitionExceptio
n{
CharStream stream =
newANTLRStringStream("3 * (2 + 4) * 3");
Sample2Lexer lexer =newSample2Lexer(stream);
TokenStream tokenStream =newCommonTokenStream(lexer);
Sample2Parser parser =newSample2Parser(tokenStream);
int result = parser.evaluator();
System.out.println("ok - result is "+ result);
}
}
java compiler/src1.g4
grammar scr1;
options {
language = Java;
}
@header {
package a.b.c;
}
@lexer::header {
package a.b.c;
}
program
: 'program' IDENT '='
(constant | variable | function | procedure | typeDecl)*
'begin'
statement*
'end' IDENT '.'
;
constant
: 'constant' IDENT ':' type ':=' expression ';'
;
variable
: 'var' IDENT (',' IDENT)* ':' type (':=' expression)? ';'
;
type
: 'Integer'
| 'Boolean'
| 'String'
| 'Char'
| IDENT
| typeSpec
;
typeDecl
: 'type' IDENT '=' typeSpec ';'
;
typeSpec
: arrayType
| recordType
| enumType
;
arrayType
: 'array' '[' INTEGER '..' INTEGER ']' 'of' type
;
recordType
: 'record' field* 'end' 'record'
;
field
: IDENT ':' type ';'
;
enumType
: '<' IDENT (',' IDENT)* '>'
;
statement
: assignmentStatement
| ifStatement
| loopStatement
| whileStatement
| procedureCallStatement
;
procedureCallStatement
: IDENT '(' actualParameters? ')' ';'
;
actualParameters
: expression (',' expression)*
;
ifStatement
: 'if' expression 'then' statement+
('elsif' expression 'then' statement+)*
('else' statement+)?
'end' 'if' ';'
;
assignmentStatement
: IDENT ':=' expression ';'
;
exitStatement
: 'exit' 'when' expression ';'
;
whileStatement
: 'while' expression 'loop'
(statement|exitStatement)*
'end' 'loop' ';'
;
loopStatement
: 'loop' (statement|exitStatement)* 'end' 'loop' ';'
;
returnStatement
: 'return' expression ';'
;
procedure
: 'procedure' IDENT '(' parameters? ')' '='
(constant | variable)*
'begin'
statement*
'end' IDENT '.'
;
function
: 'function' IDENT '(' parameters? ')' ':' type '='
(constant | variable)*
'begin'
(statement|returnStatement)*
'end' IDENT '.'
;
parameters
: parameter (',' parameter)*
;
parameter
: 'var'? IDENT ':' type
;
// expressions -- fun time!
term
: IDENT
| '(' expression ')'
| INTEGER
| STRING_LITERAL
| CHAR_LITERAL
| IDENT '(' actualParameters ')'
;
negation
: 'not'* term
;
unary
: ('+' | '-')* negation
;
mult
: unary (('*' | '/' | 'mod') unary)*
;
add
: mult (('+' | '-') mult)*
;
relation
: add (('=' | '/=' | '<' | '<=' | '>=' | '>') add)*
;
expression
: relation (('and' | 'or') relation)*
;
MULTILINE_COMMENT : '/*' .* '*/' {$channel = HIDDEN;} ;
STRING_LITERAL
: '"'
{ StringBuilder b = new StringBuilder(); }
( '"' '"' { b.appendCodePoint('"');}
| c=~('"'|'r'|'n') { b.appendCodePoint(c);}
)*
'"'
{ setText(b.toString()); }
;
CHAR_LITERAL
: ''' . ''' {setText(getText().substring(1,2));}
;
fragment LETTER : ('a'..'z' | 'A'..'Z') ;
fragment DIGIT : '0'..'9';
INTEGER : DIGIT+ ;
IDENT : LETTER (LETTER | DIGIT)*;
WS : (' ' | 't' | 'n' | 'r' | 'f')+ {$channel = HIDDEN;};
COMMENT : '//' .* ('n'|'r') {$channel = HIDDEN;};
java compiler/src2.g4
grammar src2;
options {
language = Java;
}
@header {
package a.b.c;
}
@lexer::header {
package a.b.c;
}
evaluator returns [int result]
: expression EOF { $result = $expression.result; }
;
// expressions -- fun time!
term returns [int result]
: IDENT {$result = 0;}
| '(' expression ')' {$result = $expression.result;}
| INTEGER {$result =
Integer.parseInt($INTEGER.text);}
;
unary returns [int result]
: { boolean positive = true; }
('+' | '-' { positive = !positive; })* term
{
$result = $term.result;
if (!positive)
$result = -$result;
}
;
mult returns [int result]
: op1=unary { $result = $op1.result; }
( '*' op2=unary { $result = $result * $op2.result; }
| '/' op2=unary { $result = $result / $op2.result; }
| 'mod' op2=unary { $result = $result %
$op2.result; }
)*
;
expression returns [int result]
: op1=mult { $result = $op1.result; }
( '+' op2=mult { $result = $result + $op2.result; }
| '-' op2=mult { $result = $result - $op2.result; }
)*
;
MULTILINE_COMMENT : '/*' .* '*/' {$channel = HIDDEN;} ;
STRING_LITERAL
: '"'
{ StringBuilder b = new StringBuilder(); }
( '"' '"' { b.appendCodePoint('"');}
| c=~('"'|'r'|'n') { b.appendCodePoint(c);}
)*
'"'
{ setText(b.toString()); }
;
CHAR_LITERAL
: ''' . ''' {setText(getText().substring(1,2));}
;
fragment LETTER : ('a'..'z' | 'A'..'Z') ;
fragment DIGIT : '0'..'9';
INTEGER : DIGIT+ ;
IDENT : LETTER (LETTER | DIGIT)*;
WS : (' ' | 't' | 'n' | 'r' | 'f')+ {$channel = HIDDEN;};
COMMENT : '//' .* ('n'|'r') {$channel = HIDDEN;};

java compilerCompiler1.javajava compilerCompiler1.javaimport.docx

  • 1.
    java compiler/Compiler1.javajava compiler/Compiler1.java importorg.antlr.runtime.ANTLRStringStream; import org.antlr.runtime.CharStream; import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.RecognitionException; import org.antlr.runtime.TokenStream; publicclassTest1{ publicstaticvoid main(String[] args)throwsRecognitionExceptio n{ CharStream stream = newANTLRStringStream("program XLSample1 =rn"+ "/*rn"+ " constant one : Integer := 1;rn"+ " constant two : Integer := 2 * 3;rn"+ " var x, y, z : Integer := 42;rn"+ "*/rn"+ "rn"+ " procedure foo() =rn"+ " var x : Integer := 2;rn"+ " beginrn"+ " end foo.rn"+ " procedure fee(y : Integer) =rn"+ " var x : Integer := 2;rn"+ " beginrn"+ " end fee.rn"+ " function fie(y : Integer) : Integer =rn"+ " var x : Integer := 2;rn"+ " beginrn"+ " return y;rn"+ " end fie.rn"+ "beginrn"+ "end XLSample1.");
  • 2.
    SampleLexer lexer =newSampleLexer(stream); TokenStreamtokenStream =newCommonTokenStream(lexer); SampleParser parser =newSampleParser(tokenStream); parser.program(); System.out.println("ok"); } } java compiler/Compiler2.javajava compiler/Compiler2.java import org.antlr.runtime.ANTLRStringStream; import org.antlr.runtime.CharStream; import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.RecognitionException; import org.antlr.runtime.TokenStream; publicclassTest2{ publicstaticvoid main(String[] args)throwsRecognitionExceptio n{ CharStream stream = newANTLRStringStream("3 * (2 + 4) * 3"); Sample2Lexer lexer =newSample2Lexer(stream); TokenStream tokenStream =newCommonTokenStream(lexer); Sample2Parser parser =newSample2Parser(tokenStream); int result = parser.evaluator(); System.out.println("ok - result is "+ result); } } java compiler/src1.g4 grammar scr1; options {
  • 3.
    language = Java; } @header{ package a.b.c; } @lexer::header { package a.b.c; } program : 'program' IDENT '=' (constant | variable | function | procedure | typeDecl)* 'begin' statement* 'end' IDENT '.' ;
  • 4.
    constant : 'constant' IDENT':' type ':=' expression ';' ; variable : 'var' IDENT (',' IDENT)* ':' type (':=' expression)? ';' ; type : 'Integer' | 'Boolean' | 'String' | 'Char' | IDENT | typeSpec ;
  • 5.
    typeDecl : 'type' IDENT'=' typeSpec ';' ; typeSpec : arrayType | recordType | enumType ; arrayType : 'array' '[' INTEGER '..' INTEGER ']' 'of' type ; recordType : 'record' field* 'end' 'record' ;
  • 6.
    field : IDENT ':'type ';' ; enumType : '<' IDENT (',' IDENT)* '>' ; statement : assignmentStatement | ifStatement | loopStatement | whileStatement | procedureCallStatement ; procedureCallStatement : IDENT '(' actualParameters? ')' ';'
  • 7.
    ; actualParameters : expression (','expression)* ; ifStatement : 'if' expression 'then' statement+ ('elsif' expression 'then' statement+)* ('else' statement+)? 'end' 'if' ';' ; assignmentStatement : IDENT ':=' expression ';' ; exitStatement
  • 8.
    : 'exit' 'when'expression ';' ; whileStatement : 'while' expression 'loop' (statement|exitStatement)* 'end' 'loop' ';' ; loopStatement : 'loop' (statement|exitStatement)* 'end' 'loop' ';' ; returnStatement : 'return' expression ';' ; procedure
  • 9.
    : 'procedure' IDENT'(' parameters? ')' '=' (constant | variable)* 'begin' statement* 'end' IDENT '.' ; function : 'function' IDENT '(' parameters? ')' ':' type '=' (constant | variable)* 'begin' (statement|returnStatement)* 'end' IDENT '.' ; parameters : parameter (',' parameter)* ;
  • 10.
    parameter : 'var'? IDENT':' type ; // expressions -- fun time! term : IDENT | '(' expression ')' | INTEGER | STRING_LITERAL | CHAR_LITERAL | IDENT '(' actualParameters ')' ; negation : 'not'* term
  • 11.
    ; unary : ('+' |'-')* negation ; mult : unary (('*' | '/' | 'mod') unary)* ; add : mult (('+' | '-') mult)* ; relation : add (('=' | '/=' | '<' | '<=' | '>=' | '>') add)* ;
  • 12.
    expression : relation (('and'| 'or') relation)* ; MULTILINE_COMMENT : '/*' .* '*/' {$channel = HIDDEN;} ; STRING_LITERAL : '"' { StringBuilder b = new StringBuilder(); } ( '"' '"' { b.appendCodePoint('"');} | c=~('"'|'r'|'n') { b.appendCodePoint(c);} )* '"' { setText(b.toString()); } ; CHAR_LITERAL
  • 13.
    : ''' .''' {setText(getText().substring(1,2));} ; fragment LETTER : ('a'..'z' | 'A'..'Z') ; fragment DIGIT : '0'..'9'; INTEGER : DIGIT+ ; IDENT : LETTER (LETTER | DIGIT)*; WS : (' ' | 't' | 'n' | 'r' | 'f')+ {$channel = HIDDEN;}; COMMENT : '//' .* ('n'|'r') {$channel = HIDDEN;}; java compiler/src2.g4 grammar src2; options { language = Java; } @header {
  • 14.
    package a.b.c; } @lexer::header { packagea.b.c; } evaluator returns [int result] : expression EOF { $result = $expression.result; } ; // expressions -- fun time! term returns [int result] : IDENT {$result = 0;} | '(' expression ')' {$result = $expression.result;} | INTEGER {$result = Integer.parseInt($INTEGER.text);} ;
  • 15.
    unary returns [intresult] : { boolean positive = true; } ('+' | '-' { positive = !positive; })* term { $result = $term.result; if (!positive) $result = -$result; } ; mult returns [int result] : op1=unary { $result = $op1.result; } ( '*' op2=unary { $result = $result * $op2.result; } | '/' op2=unary { $result = $result / $op2.result; } | 'mod' op2=unary { $result = $result % $op2.result; } )*
  • 16.
    ; expression returns [intresult] : op1=mult { $result = $op1.result; } ( '+' op2=mult { $result = $result + $op2.result; } | '-' op2=mult { $result = $result - $op2.result; } )* ; MULTILINE_COMMENT : '/*' .* '*/' {$channel = HIDDEN;} ; STRING_LITERAL : '"' { StringBuilder b = new StringBuilder(); } ( '"' '"' { b.appendCodePoint('"');} | c=~('"'|'r'|'n') { b.appendCodePoint(c);} )*
  • 17.
    '"' { setText(b.toString()); } ; CHAR_LITERAL :''' . ''' {setText(getText().substring(1,2));} ; fragment LETTER : ('a'..'z' | 'A'..'Z') ; fragment DIGIT : '0'..'9'; INTEGER : DIGIT+ ; IDENT : LETTER (LETTER | DIGIT)*; WS : (' ' | 't' | 'n' | 'r' | 'f')+ {$channel = HIDDEN;}; COMMENT : '//' .* ('n'|'r') {$channel = HIDDEN;};