1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
// This file is part of PyANTLR. See LICENSE.txt for license
// details..........Copyright (C) Wolfgang Haefelinger, 2004.
//
// $Id$
options {
language=Python;
}
class incfile_p extends Parser;
{
def traceOut(self,rname):
print "exit ",rname,"; LT(1)=",self.LT(1)
def traceIn(self,rname):
print "enter ",rname,"; LT(1)=",self.LT(1)
}
startRule
: ( decl )+
;
decl: INT a:ID {print("decl "+a.getText());}
( COMMA b:ID {print("decl "+b.getText());} )*
SEMI
;
{
pass
}
class incfile_l extends Lexer;
options {
charVocabulary = '\3'..'\377';
k=2;
}
tokens {
INT="int";
}
{
def uponEOF(self):
import incfile
if incfile.getselector().getCurrentStream() != incfile.getlexer():
incfile.getselector().pop()
incfile.getselector().retry()
else:
print("Hit EOF of main file")
}
SEMI: ';'
;
COMMA
: ','
;
ID
: ('a'..'z')+
;
INCLUDE
: "#include" (WS)? f:STRING
{
name = f.getText();
input= None
try:
fi = open(name,"rb")
except IOError:
import sys
print >>sys.stderr,"cannot find file ",name
else:
import incfile
assert fi
sublexer = Lexer(fi);
sublexer.setFilename(name);
incfile.getparser().setFilename(name);
incfile.getselector().push(sublexer);
incfile.getselector().retry()
}
;
STRING
: '"'! ( ~'"' )* '"'!
;
WS : ( ' '
| '\t'
| '\f'
// handle newlines
| ( options {generateAmbigWarnings=false;}
: "\r\n" // Evil DOS
| '\r' // Macintosh
| '\n' // Unix (the right way)
)
{ self.newline(); }
)+
{ $setType(Token.SKIP); }
;
|