forked from jasder/antlr
commit
6fe8ac1ac6
|
@ -1,5 +1,9 @@
|
|||
ANTLR v4 Honey Badger early access
|
||||
|
||||
Jan 30, 2012
|
||||
|
||||
* Moving to github.
|
||||
|
||||
Jan 28, 2012
|
||||
|
||||
* ~[] stuff is allowed and works inside sets etc...
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
ANTLR v4 early access
|
||||
|
||||
Terence Parr, parrt at cs usfca edu
|
||||
ANTLR project lead and supreme dictator for life
|
||||
University of San Francisco
|
||||
|
||||
INTRODUCTION
|
||||
|
||||
Coming soon...
|
|
@ -1,3 +1,82 @@
|
|||
lexer grammar E;
|
||||
I : ~[ab] ~[cd]* {System.out.println("I");} ;
|
||||
WS : [ \n\u000D]+ -> skip ;
|
||||
/** Simple statically-typed programming language with methods and variables
|
||||
* taken from "Language Implementation Patterns" book.
|
||||
*/
|
||||
grammar E;
|
||||
|
||||
// START: file
|
||||
file: (methodDecl | varDecl)+ ;
|
||||
// END: file
|
||||
|
||||
// START: var
|
||||
varDecl
|
||||
: type ID ('=' expr)? ';'
|
||||
;
|
||||
type: 'float' | 'int' | 'void' ; // user-defined types
|
||||
// END: var
|
||||
|
||||
// START: method
|
||||
methodDecl
|
||||
: type ID '(' formalParameters? ')' block // "void f(int x) {...}"
|
||||
;
|
||||
|
||||
formalParameters
|
||||
: type ID (',' type ID)*
|
||||
;
|
||||
// END: method
|
||||
|
||||
// START: stat
|
||||
block: '{' stat* '}' ; // possibly empty statement block
|
||||
|
||||
stat: block
|
||||
| varDecl
|
||||
| 'if' expr 'then' stat ('else' stat)?
|
||||
| 'return' expr? ';'
|
||||
| expr '=' expr ';' // assignment
|
||||
| expr ';' // func call
|
||||
;
|
||||
// END: stat
|
||||
|
||||
/* expr below becomes the following non-left recursive rule:
|
||||
expr[int _p]
|
||||
: ( '-' expr[6]
|
||||
| '!' expr[5]
|
||||
| ID
|
||||
| INT
|
||||
| '(' expr ')'
|
||||
)
|
||||
( {8 >= $_p}? '*' expr[9]
|
||||
| {7 >= $_p}? ('+'|'-') expr[8]
|
||||
| {4 >= $_p}? '==' expr[5]
|
||||
| {10 >= $_p}? '[' expr ']'
|
||||
| {9 >= $_p}? '(' exprList? ')'
|
||||
)*
|
||||
;
|
||||
*/
|
||||
|
||||
// START: expr
|
||||
expr: expr '[' expr ']' // array index like a[i], a[i][j]
|
||||
| expr '(' exprList? ')' // func call like f(), f(x), f(1,2)
|
||||
| expr '*' expr
|
||||
| expr ('+'|'-') expr
|
||||
| '-' expr // unary minus
|
||||
| '!' expr // boolean not
|
||||
| expr '==' expr // equality comparison (lowest priority op)
|
||||
| ID // variable reference
|
||||
| INT
|
||||
| '(' expr ')'
|
||||
;
|
||||
|
||||
exprList : expr (',' expr)* ; // arg list
|
||||
// END: expr
|
||||
|
||||
ID : LETTER (LETTER | [0-9])* ;
|
||||
fragment
|
||||
LETTER : [a-zA-Z] ;
|
||||
|
||||
INT : [0-9]+ ;
|
||||
|
||||
WS : [ \t\n\r]+ -> skip ;
|
||||
|
||||
SL_COMMENT
|
||||
: '//' .* '\n' -> skip
|
||||
;
|
||||
|
|
|
@ -237,6 +237,7 @@ public class LexerATNFactory extends ParserATNFactory {
|
|||
int x = c;
|
||||
int y = chars.charAt(i+2);
|
||||
if ( x<=y ) set.add(x,y);
|
||||
i+=2;
|
||||
}
|
||||
else {
|
||||
set.add(c);
|
||||
|
|
|
@ -119,12 +119,7 @@ package org.antlr.v4.parse;
|
|||
|
||||
|
||||
@members {
|
||||
public Token prevToken;
|
||||
@Override
|
||||
public void emit(Token token) {
|
||||
super.emit(token);
|
||||
if ( token.getChannel()==Token.DEFAULT_CHANNEL ) prevToken = token;
|
||||
}
|
||||
public boolean isLexer = false;
|
||||
}
|
||||
|
||||
// --------
|
||||
|
@ -227,10 +222,10 @@ COMMENT
|
|||
|
||||
ARG_OR_CHARSET
|
||||
options {k=1;}
|
||||
: {prevToken.getType()!=RULE_REF}?=> LEXER_CHAR_SET {$type=LEXER_CHAR_SET;}
|
||||
| {prevToken.getType()==RULE_REF}?=> ARG_ACTION {$type=ARG_ACTION;}
|
||||
: {isLexer}?=> LEXER_CHAR_SET {$type=LEXER_CHAR_SET;}
|
||||
| {!isLexer}?=> ARG_ACTION {$type=ARG_ACTION;}
|
||||
;
|
||||
|
||||
|
||||
fragment
|
||||
LEXER_CHAR_SET
|
||||
: '[' ('\\]'|'\\'|~('\\'|']'))* ']'
|
||||
|
@ -412,7 +407,7 @@ TOKENS_SPEC : 'tokens' WSNLCHARS* '{' ;
|
|||
|
||||
IMPORT : 'import' ;
|
||||
FRAGMENT : 'fragment' ;
|
||||
LEXER : 'lexer' ;
|
||||
LEXER : 'lexer' {isLexer=true;} ;
|
||||
PARSER : 'parser' ;
|
||||
GRAMMAR : 'grammar' ;
|
||||
PROTECTED : 'protected' ;
|
||||
|
|
Loading…
Reference in New Issue