📄 stdcparser.g
字号:
{
import isis.anp.common.CToken;
import isis.anp.common.LineObject;
import isis.anp.common.PreprocessorInfoChannel;
import java.io.InputStream;
import java.io.Reader;
import java.util.Hashtable;
import antlr.ANTLRHashString;
import antlr.ByteBuffer;
import antlr.CharBuffer;
import antlr.CharStreamException;
import antlr.CharStreamIOException;
import antlr.InputBuffer;
import antlr.LexerSharedInputState;
import antlr.NoViableAltForCharException;
import antlr.RecognitionException;
import antlr.Token;
import antlr.TokenStream;
import antlr.TokenStreamException;
import antlr.TokenStreamIOException;
import antlr.TokenStreamRecognitionException;
import antlr.collections.impl.BitSet;
}
class StdCLexer extends Lexer;
options
{
k = 3;
exportVocab = StdC;
testLiterals = false;
}
{
LineObject lineObject = new LineObject();
String originalSource = "";
PreprocessorInfoChannel preprocessorInfoChannel = new PreprocessorInfoChannel();
int tokenNumber = 0;
boolean countingTokens = true;
int deferredLineCount = 0;
public void setCountingTokens(boolean ct)
{
countingTokens = ct;
if ( countingTokens ) {
tokenNumber = 0;
}
else {
tokenNumber = 1;
}
}
public void setOriginalSource(String src)
{
originalSource = src;
lineObject.setSource(src);
}
public void setSource(String src)
{
lineObject.setSource(src);
}
public PreprocessorInfoChannel getPreprocessorInfoChannel()
{
return preprocessorInfoChannel;
}
public void setPreprocessingDirective(String pre)
{
preprocessorInfoChannel.addLineForTokenNumber( pre, new Integer(tokenNumber) );
}
protected Token makeToken(int t)
{
if ( t != Token.SKIP && countingTokens) {
tokenNumber++;
}
CToken tok = (CToken) super.makeToken(t);
tok.setLine(lineObject.line);
tok.setSource(lineObject.source);
tok.setTokenNumber(tokenNumber);
lineObject.line += deferredLineCount;
deferredLineCount = 0;
return tok;
}
public void deferredNewline() {
deferredLineCount++;
}
public void newline() {
super.newline();
lineObject.newline();
}
}
protected
Vocabulary
: '\3'..'\377'
;
/* Operators: */
ASSIGN : '=' ;
COLON : ':' ;
COMMA : ',' ;
QUESTION : '?' ;
SEMI : ';' ;
PTR : "->" ;
// DOT & VARARGS are commented out since they are generated as part of
// the Number rule below due to some bizarre lexical ambiguity shme.
// DOT : '.' ;
protected
DOT:;
// VARARGS : "..." ;
protected
VARARGS:;
LPAREN : '(' ;
RPAREN : ')' ;
LBRACKET : '[' ;
RBRACKET : ']' ;
LCURLY : '{' ;
RCURLY : '}' ;
EQUAL : "==" ;
NOT_EQUAL : "!=" ;
LTE : "<=" ;
LT : "<" ;
GTE : ">=" ;
GT : ">" ;
DIV : '/' ;
DIV_ASSIGN : "/=" ;
PLUS : '+' ;
PLUS_ASSIGN : "+=" ;
INC : "++" ;
MINUS : '-' ;
MINUS_ASSIGN : "-=" ;
DEC : "--" ;
STAR : '*' ;
STAR_ASSIGN : "*=" ;
MOD : '%' ;
MOD_ASSIGN : "%=" ;
RSHIFT : ">>" ;
RSHIFT_ASSIGN : ">>=" ;
LSHIFT : "<<" ;
LSHIFT_ASSIGN : "<<=" ;
LAND : "&&" ;
LNOT : '!' ;
LOR : "||" ;
BAND : '&' ;
BAND_ASSIGN : "&=" ;
BNOT : '~' ;
BOR : '|' ;
BOR_ASSIGN : "|=" ;
BXOR : '^' ;
BXOR_ASSIGN : "^=" ;
Whitespace
: ( ( '\003'..'\010' | '\t' | '\013' | '\f' | '\016'.. '\037' | '\177'..'\377' | ' ' )
| "\r\n" { newline(); }
| ( '\n' | '\r' ) { newline(); }
) { _ttype = Token.SKIP; }
;
Comment
: "/*"
( { LA(2) != '/' }? '*'
| "\r\n" { deferredNewline(); }
| ( '\r' | '\n' ) { deferredNewline(); }
| ~( '*'| '\r' | '\n' )
)*
"*/" { _ttype = Token.SKIP;
}
;
CPPComment
:
"//" ( ~('\n') )*
{
_ttype = Token.SKIP;
}
;
PREPROC_DIRECTIVE
options {
paraphrase = "a line directive";
}
:
'#'
( ( "line" || (( ' ' | '\t' | '\014')+ '0'..'9')) => LineDirective
| (~'\n')* { setPreprocessingDirective(getText()); }
)
{
_ttype = Token.SKIP;
}
;
protected Space:
( ' ' | '\t' | '\014')
;
protected LineDirective
{
boolean oldCountingTokens = countingTokens;
countingTokens = false;
}
:
{
lineObject = new LineObject();
deferredLineCount = 0;
}
("line")? //this would be for if the directive started "#line", but not there for GNU directives
(Space)+
n:Number { lineObject.setLine(Integer.parseInt(n.getText())); }
(Space)+
( fn:StringLiteral { try {
lineObject.setSource(fn.getText().substring(1,fn.getText().length()-1));
}
catch (StringIndexOutOfBoundsException e) { /*not possible*/ }
}
| fi:ID { lineObject.setSource(fi.getText()); }
)?
(Space)*
("1" { lineObject.setEnteringFile(true); } )?
(Space)*
("2" { lineObject.setReturningToFile(true); } )?
(Space)*
("3" { lineObject.setSystemHeader(true); } )?
(Space)*
("4" { lineObject.setTreatAsC(true); } )?
(~('\r' | '\n'))*
("\r\n" | "\r" | "\n")
{
preprocessorInfoChannel.addLineForTokenNumber(new LineObject(lineObject), new Integer(tokenNumber));
countingTokens = oldCountingTokens;
}
;
/* Literals: */
/*
* Note that we do NOT handle tri-graphs nor multi-byte sequences.
*/
/*
* Note that we can't have empty character constants (even though we
* can have empty strings :-).
*/
CharLiteral
: '\'' ( Escape | ~( '\'' ) ) '\''
;
/*
* Can't have raw imbedded newlines in string constants. Strict reading of
* the standard gives odd dichotomy between newlines & carriage returns.
* Go figure.
*/
StringLiteral
: '"'
( Escape
| (
'\r' { deferredNewline(); }
| '\n' {
deferredNewline();
_ttype = BadStringLiteral;
}
| '\\' '\n' {
deferredNewline();
}
)
| ~( '"' | '\r' | '\n' | '\\' )
)*
'"'
;
protected BadStringLiteral
: // Imaginary token.
;
/*
* Handle the various escape sequences.
*
* Note carefully that these numeric escape *sequences* are *not* of the
* same form as the C language numeric *constants*.
*
* There is no such thing as a binary numeric escape sequence.
*
* Octal escape sequences are either 1, 2, or 3 octal digits exactly.
*
* There is no such thing as a decimal escape sequence.
*
* Hexadecimal escape sequences are begun with a leading \x and continue
* until a non-hexadecimal character is found.
*
* No real handling of tri-graph sequences, yet.
*/
protected
Escape
: '\\'
( options{warnWhenFollowAmbig=false;}:
'a'
| 'b'
| 'f'
| 'n'
| 'r'
| 't'
| 'v'
| '"'
| '\''
| '\\'
| '?'
| ('0'..'3') ( options{warnWhenFollowAmbig=false;}: Digit ( options{warnWhenFollowAmbig=false;}: Digit )? )?
| ('4'..'7') ( options{warnWhenFollowAmbig=false;}: Digit )?
| 'x' ( options{warnWhenFollowAmbig=false;}: Digit | 'a'..'f' | 'A'..'F' )+
)
;
/* Numeric Constants: */
protected
Digit
: '0'..'9'
;
protected
LongSuffix
: 'l'
| 'L'
;
protected
UnsignedSuffix
: 'u'
| 'U'
;
protected
FloatSuffix
: 'f'
| 'F'
;
protected
Exponent
: ( 'e' | 'E' ) ( '+' | '-' )? ( Digit )+
;
protected
DoubleDoubleConst:;
protected
FloatDoubleConst:;
protected
LongDoubleConst:;
protected
IntOctalConst:;
protected
LongOctalConst:;
protected
UnsignedOctalConst:;
protected
IntIntConst:;
protected
LongIntConst:;
protected
UnsignedIntConst:;
protected
IntHexConst:;
protected
LongHexConst:;
protected
UnsignedHexConst:;
Number
: ( ( Digit )+ ( '.' | 'e' | 'E' ) )=> ( Digit )+
( '.' ( Digit )* ( Exponent )?
| Exponent
) { _ttype = DoubleDoubleConst; }
( FloatSuffix { _ttype = FloatDoubleConst; }
| LongSuffix { _ttype = LongDoubleConst; }
)?
| ( "..." )=> "..." { _ttype = VARARGS; }
| '.' { _ttype = DOT; }
( ( Digit )+ ( Exponent )?
{ _ttype = DoubleDoubleConst; }
( FloatSuffix { _ttype = FloatDoubleConst; }
| LongSuffix { _ttype = LongDoubleConst; }
)?
)?
| '0' ( '0'..'7' )* { _ttype = IntOctalConst; }
( LongSuffix { _ttype = LongOctalConst; }
| UnsignedSuffix { _ttype = UnsignedOctalConst; }
)?
| '1'..'9' ( Digit )* { _ttype = IntIntConst; }
( LongSuffix { _ttype = LongIntConst; }
| UnsignedSuffix { _ttype = UnsignedIntConst; }
)?
| '0' ( 'x' | 'X' ) ( 'a'..'f' | 'A'..'F' | Digit )+
{ _ttype = IntHexConst; }
( LongSuffix { _ttype = LongHexConst; }
| UnsignedSuffix { _ttype = UnsignedHexConst; }
)?
;
ID
options
{
testLiterals = true;
}
: ( 'a'..'z' | 'A'..'Z' | '_' )
( 'a'..'z' | 'A'..'Z' | '_' | '0'..'9' )*
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -