Files
Software-Analysis/ExprLexer.g4

251 lines
5.9 KiB
Plaintext
Raw Normal View History

lexer grammar ExprLexer;
// LINE TERMINATORS -----------------------------------------------------------------------------------------------------------------------
2025-09-27 19:55:27 -06:00
fragment LineTerminator: '\r' '\n'? | '\n';
//WHITE SPACE ----------------------------------------------------------------------------------------------------------------------------------------
2025-09-27 17:07:46 -06:00
WhiteSpace: (' ' | '\t' | '\f' | LineTerminator) -> skip;
//COMMENTS --------------------------------------------------------------------------------------------------------------------------------------------------
2025-09-27 19:55:27 -06:00
fragment EndOfLineComment: '//' ~('\r' | '\n')* LineTerminator?;
2025-09-27 17:07:46 -06:00
Comment: (TraditionalComment | EndOfLineComment) -> skip;
fragment TraditionalComment:
2025-09-27 19:55:27 -06:00
'/*' NotStar CommentTail;
2025-09-27 19:55:27 -06:00
//fragment EndOfLineComment:
// '//' CharactersInLine? LineTerminator;
fragment CommentTail: '*' CommentTailStar | NotStar ;
fragment CommentTailStar:
'/' | '*' CommentTailStar | NotStarNotSlash CommentTail;
fragment NotStar:
[^*] | LineTerminator;
fragment NotStarNotSlash:
[^*/] | LineTerminator;
2025-09-27 19:55:27 -06:00
//fragment CharactersInLine: InputCharacter
// | InputCharacter;
//// UNICODE --------------------------------------------------------------------------------------------------------------
//UnicodeInputCharacter: UnicodeEscape | RawInputCharacter;
//
//fragment UnicodeEscape: '\\' UnicodeMarker HexDigit HexDigit HexDigit HexDigit;
//
//fragment UnicodeMarker: 'u'+;
//
//
//fragment RawInputCharacter: .;
// //not complete need to ask question from prof.
//
//
//fragment InputCharacter: [^\n\r];
// KEYWORDS --------------------------------------------------------------------------------------------------------
Abstract: 'abstract';
Assert: 'assert';
Boolean: 'boolean';
Break: 'break';
Byte: 'byte';
Case: 'case';
Catch: 'catch';
Char: 'char';
Class: 'class';
Const: 'const';
Continue: 'continue';
Default: 'default';
Do: 'do';
Double: 'double';
Else: 'else';
Extends: 'extends';
Final: 'final';
Finally: 'finally';
Float: 'float';
For: 'for';
Goto: 'goto';
If: 'if';
Implements: 'implements';
Import: 'import';
InstanceOf: 'instanceof';
Int: 'int';
Interface: 'interface';
Long: 'long';
Native: 'native';
New: 'new';
Package: 'package';
Private: 'private';
Protected: 'protected';
Public: 'public';
Return: 'return';
Short: 'short';
Static: 'static';
Strictfp: 'strictfp';
Super: 'super';
Switch: 'switch';
Synchronized: 'synchronized';
This: 'this';
Throw: 'throw';
Throws: 'throws';
Transient: 'transient';
Try: 'try';
Void: 'void';
Volatile: 'volatile';
While: 'while';
2025-09-27 19:55:27 -06:00
Dot: '.';
// LITERALS -------------------------------------------------------------------------------------------------------------------
IntegerLiteral: DecimalIntegerLiteral | HexIntegerLiteral | OctalIntegerLiteral;
fragment DecimalIntegerLiteral:
DecimalNumeral IntegerTypeSuffix?;
fragment HexIntegerLiteral:
HexNumeral IntegerTypeSuffix?;
fragment OctalIntegerLiteral:
OctalNumeral IntegerTypeSuffix?;
fragment IntegerTypeSuffix:
[lL];
fragment DecimalNumeral:
'0' | NonZeroDigit Digits?;
fragment HexNumeral:
'0' 'x' HexDigits | '0' 'X' HexDigits;
fragment HexDigits:
HexDigit | HexDigit HexDigits;
fragment HexDigit:
[0-9a-fA-F];
FloatingPointLiteral: Digits '.' Digits? ExponentPart? FloatTypeSuffix?
| '.' Digits ExponentPart? FloatTypeSuffix?
| Digits ExponentPart FloatTypeSuffix?
| Digits ExponentPart? FloatTypeSuffix;
fragment ExponentPart:
ExponentIndicator SignedInteger;
fragment ExponentIndicator:
[eE];
fragment SignedInteger:
Sign? Digits;
fragment Digits:
Digit+;
fragment Digit:
'0' | NonZeroDigit;
fragment NonZeroDigit:
[1-9];
fragment Sign:
[+-];
fragment FloatTypeSuffix:
[fFdD];
CharacterLiteral: '\'' SingleCharacter '\'' | '\'' EscapeSequence '\'';
fragment SingleCharacter:
[^'\\];
StringLiteral: '"' StringCharacters? '"';
fragment StringCharacters:
StringCharacter+;
fragment StringCharacter:
SingleCharacter | EscapeSequence;
fragment EscapeSequence:
'\\' ('u0008' | 'u0009' | 'u000a' | 'u000c' | 'u000d' | 'u0022' | 'u0027' | 'u005c' | OctalEscape);
fragment OctalEscape:
'\\' OctalDigit | '\\' OctalDigit OctalDigit | '\\' ZeroToThree OctalDigit OctalDigit;
fragment OctalNumeral:
'0' OctalDigits;
fragment OctalDigits:
OctalDigit;
fragment OctalDigit:
[0-7];
fragment ZeroToThree:
[0-3];
BooleanLiteral: 'true' | 'false' ;
NullLiteral: 'null';
//SEPRATORS -------------------------------------------------------------------------------------------------------------------------
2025-09-26 23:52:51 -06:00
ParenthesesLeft: '(';
ParenthesesRight: ')';
CurlyBracketLeft: '{';
CurlyBracketRight: '}';
SquareBracketLeft: '[';
SquareBracketRight: ']';
Semicolon: ';';
Comma: ',';
2025-09-27 19:55:27 -06:00
//OPERATORS ---------------------------------------------------------------------------------------------------------------------------------------
2025-09-27 19:55:27 -06:00
UnsignedRightShiftAssign: '>>>=';
EqualTo: '==';
2025-09-27 19:55:27 -06:00
NotEqualTo: '!=';
LessThanEqualTo: '<=';
GreaterThanEqualTo: '>=';
ConditionalAND: '&&';
ConditionalOR: '||';
Increment: '++';
Decrement: '--';
LeftShift: '<<';
SignedRightShift: '>>';
UnsignedRightShift: '>>>';
AddAssign: '+=';
SubtractAssign: '-=';
MultiplyAssign: '*=';
DivideAssign: '/=';
BitwiseANDAssign: '&=';
BitwiseORAssign: '|=';
BitwiseXORAssign: '^=';
RemainderAssign: '%=';
LeftShiftAssign: '<<=';
SignedRightShiftAssign: '>>=';
2025-09-27 19:55:27 -06:00
Assignment: '=';
BitwiseComplement: '~';
LessThan: '<';
GreaterThan: '>';
LogicalComplement: '!';
Question: '?';
Colon: ':';
Addition: '+';
Subtraction: '-';
Multiplication: '*';
Division: '/';
BitwiseAND: '&';
BitwiseOR: '|';
BitwiseXOR: '^';
Remainder: '%';
//IDENTIFIERS -------------------------------------------------------------------------------------------------------------------------------------------
2025-09-27 19:55:27 -06:00
IDENTIFIER: JavaLetter JavaLetterOrDigit*;
fragment JavaLetter:
2025-09-27 19:55:27 -06:00
[a-zA-Z$_];
fragment JavaLetterOrDigit:
2025-09-27 19:55:27 -06:00
[A-Za-z0-9$_];