Merge pull request #3 from parrt/master

pulling in fixes
This commit is contained in:
Terence Parr 2012-02-01 16:32:15 -08:00
commit 6fe8ac1ac6
5 changed files with 101 additions and 13 deletions

View File

@ -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...

9
README.txt Normal file
View File

@ -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...

View File

@ -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
;

View File

@ -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);

View File

@ -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' ;