beetl 2 文法初稿

感谢antlr4,让事情变得容易

lexer grammar BeetlLexer;


If:'if';
For:'for';
Else:'else';
While:'while';
Switch:'switch';
Select:'select';
Return:'return';
Break:'break';
Continue:'continue';
Var:'var';    
Directive:'DIRECTIVE'|'directive';
Case:'case';
Default:'default';
Try:'try';
Catch:'catch';   

LEFT_BRACE:'{';
RIGHT_BRACE:'}';
LEFT_PAR:'(';
RIGHT_PAR:')';
LEFT_SQBR:'[';
RIGHT_SQBR:']';
INCREASE:'++';
DECREASE:'--';
VIRTUAL:'.~';
ADD:'+';
MIN:'-';
MUlTIP:'*';
DIV:'/';
MOD:'%';
EQUAL:'==';
NOT_EQUAL:'!=';
ASSIN:'=';
LARGE:'>';
LESS:'<';
NOT:'!';
AND:'&&';
OR:'||';
QUESTOIN:'?';
AT:'@';
NULL:'null';
TRUE:'true';
FALSE:'false';
END:';';
COMMA:',';
COLON:':';
PERIOD:'.';
FOR_IN:'in';
LEFT_TOKEN:'<<';
RIGHT_TOKEN:'>>';
LEFT_TEXT_TOKEN	:'<$';
     

// LEXER

HexLiteral : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ;

DecimalLiteral : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;

OctalLiteral : '0' ('0'..'7')+ IntegerTypeSuffix? ;

fragment
HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;

fragment
IntegerTypeSuffix : ('l'|'L') ;

FloatingPointLiteral
    :   ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix?
    |   '.' ('0'..'9')+ Exponent? FloatTypeSuffix?
    |   ('0'..'9')+ Exponent FloatTypeSuffix?
    |   ('0'..'9')+ FloatTypeSuffix
    |   ('0x' | '0X') (HexDigit )*
        ('.' (HexDigit)*)?
        ( 'p' | 'P' )
        ( '+' | '-' )?
        ( '0' .. '9' )+
        FloatTypeSuffix?
    ;

fragment
Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;

fragment
FloatTypeSuffix : ('f'|'F'|'d'|'D') ;

CharacterLiteral
    :   '\'' ( EscapeSequence | ~('\''|'\\') ) '\''
    ;

StringLiteral
    :  '"' ( EscapeSequence | ~('\\'|'"') )* '"'
    ;

fragment
EscapeSequence
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    |   UnicodeEscape
    |   OctalEscape
    ;

fragment
OctalEscape
    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7')
    ;

fragment
UnicodeEscape
    :   '\\' 'u' HexDigit HexDigit HexDigit HexDigit
    ;


Identifier
    :   Letter (Letter|JavaIDDigit)*
    ;

/**I found this char range in JavaCC's grammar, but Letter and Digit overlap.
   Still works, but...
 */
fragment
Letter
    :  '\u0024' |
       '\u0041'..'\u005a' |
       '\u005f' |
       '\u0061'..'\u007a' |
       '\u00c0'..'\u00d6' |
       '\u00d8'..'\u00f6' |
       '\u00f8'..'\u00ff' |
       '\u0100'..'\u1fff' |
       '\u3040'..'\u318f' |
       '\u3300'..'\u337f' |
       '\u3400'..'\u3d2d' |
       '\u4e00'..'\u9fff' |
       '\uf900'..'\ufaff'
    ;

fragment
JavaIDDigit
    :  '\u0030'..'\u0039' |
       '\u0660'..'\u0669' |
       '\u06f0'..'\u06f9' |
       '\u0966'..'\u096f' |
       '\u09e6'..'\u09ef' |
       '\u0a66'..'\u0a6f' |
       '\u0ae6'..'\u0aef' |
       '\u0b66'..'\u0b6f' |
       '\u0be7'..'\u0bef' |
       '\u0c66'..'\u0c6f' |
       '\u0ce6'..'\u0cef' |
       '\u0d66'..'\u0d6f' |
       '\u0e50'..'\u0e59' |
       '\u0ed0'..'\u0ed9' |
       '\u1040'..'\u1049'
   ;
COMMENT_OPEN
    :   '/*'    ->mode(ISLAND),channel(HIDDEN) 
    ;
mode ISLAND;
PARAS:'@' Identifier ':' Identifier ('.' Identifier)*  ;
WS1  :   [ \r\t\u000C\n]+ -> channel(HIDDEN);
COMMENT_END: '*/'  -> mode(DEFAULT_MODE),channel(HIDDEN)
;

WS  :   [ \r\t\u000C\n]+ -> channel(HIDDEN)
    ;

LINE_COMMENT
    : '//' ~[\r\n]* '\r'? '\n' -> channel(HIDDEN)
    ;

你可能感兴趣的:(beetl 2 文法初稿)