Simple Ast

grammar SimpleAst;
/*
options {
    tokenVocab=SimpleAstLexer;
}
*/
compilationUnit
    : arrClassDeclaration
    ;
/**************************************************************************
        Class Declaration
**************************************************************************/
arrClassDeclaration
    : '[' ']'
    | '[' objClassDeclaration (',' objClassDeclaration)* ','? ']'
    | objClassDeclaration
    ;

objClassDeclaration
    : '{' pairClassDeclaration '}'
    ;

pairClassDeclaration
    : AST_LEXER_CLASS_DECLARATION ':' '{' '}'
    | AST_LEXER_CLASS_DECLARATION ':' '{' valueClassDeclaration '}'
    ;

valueClassDeclaration
    : recordClassDeclaration (',' recordClassDeclaration)*
    ;

recordClassDeclaration
    : pairComm
    | pairClassName
    | pairClassBody
    ;
/**************************************************************************
        Class Body
**************************************************************************/
arrClassBody
    : '[' objClassBody (',' objClassBody)* ','? ']'
    ;

objClassBody
    : '{' pairClassBody '}'
    ;

pairClassBody
    : AST_LEXER_CLASS_BODY ':' '{' '}'
    | AST_LEXER_CLASS_BODY ':' '{' valueClassBody '}'
    ;

valueClassBody
    : reocrdClassBody (',' reocrdClassBody)*
    ;

reocrdClassBody
    : arrClassMember
    ;
/**************************************************************************
        Class Memeber
**************************************************************************/
arrClassMember
    : '[' ']'
    | '[' objClassMember (',' objClassMember)* ','? ']'
    ;

objClassMember
    : '{' baseClassMember '}'
    ;

baseClassMember
    : pairFieldDeclaration
    ;

/**************************************************************************
        Field Declaration
**************************************************************************/
arrFieldDeclaration
    : '[' objFieldDeclaration (',' objFieldDeclaration)* ','? ']'
    ;

objFieldDeclaration
    : '{' pairFieldDeclaration '}'
    ;

pairFieldDeclaration
    : AST_LEXER_FIELD_DECLARATION ':' '{' valueFieldDeclaration '}'
    ;

valueFieldDeclaration
    : reocrdFieldDeclaration (',' reocrdFieldDeclaration)*
    ;

reocrdFieldDeclaration
    : pairComm
    | pairFieldType
    | pairFieldName
    | pairFieldInitializer
    ;

/**************************************************************************
        Field Type
**************************************************************************/
arrFieldType
    : '[' objFieldType (',' objFieldType)* ','? ']'
    ;

objFieldType
    : '{' pairFieldType '}'
    ;

pairFieldType
    : AST_LEXER_FIELD_TYPE ':' '{' valueFieldType '}'
    ;

valueFieldType
    : reocrdFieldType (',' reocrdFieldType)*
    ;

reocrdFieldType
    : pairPrimitiveType
    | pairClassType
    ;

/**************************************************************************
        Primitive Type
**************************************************************************/
arrClassType
    : '[' objClassType (',' objClassType)* ','? ']'
    ;

objClassType
    : '{' pairClassType '}'
    ;

pairClassType
    : pairStringType
    | pairCustomType
    ;
/**************************************************************************
        Custom Type
**************************************************************************/
arrCustomType
    : '[' objCustomType (',' objCustomType)* ','? ']'
    ;

objCustomType
    : '{' pairCustomType '}'
    ;

pairCustomType
    : AST_LEXER_CUSTOM_TYPE ':' '{' valueCustomType '}'
    ;

valueCustomType
    : reocrdCustomType (',' reocrdCustomType)*
    ;

reocrdCustomType
    : pairIdentifier
    | pairCustomType
    ;

/**************************************************************************
        String Type
**************************************************************************/
arrStringType
    : '[' objStringType (',' objStringType)* ','? ']'
    ;

objStringType
    : '{' pairStringType '}'
    ;

pairStringType
    : AST_LEXER_STRING_TYPE ':' '{' valueStringType '}'
    ;

valueStringType
    : reocrdStringType (',' reocrdStringType)*
    ;

reocrdStringType
    : pairIdentifier
    ;

/**************************************************************************
        Primitive Type
**************************************************************************/
arrPrimitiveType
    : '[' objPrimitiveType (',' objPrimitiveType)* ','? ']'
    ;

objPrimitiveType
    : '{' pairPrimitiveType '}'
    ;

pairPrimitiveType
    : pairPrimitiveIntType
    | pairPrimitiveLongType
    | arrPrimitiveDoubleType
    | arrPrimitiveDecimalType
    ;

/**************************************************************************
        Primitive Decimal Type
**************************************************************************/
arrPrimitiveDecimalType
    : '[' objPrimitiveDecimalType (',' objPrimitiveDecimalType)* ','? ']'
    ;

objPrimitiveDecimalType
    : '{' pairPrimitiveDecimalType '}'
    ;

pairPrimitiveDecimalType
    : AST_LEXER_PRIMITIVE_DECIMAL_TYPE ':' '{' valuePrimitiveDecimalType '}'
    ;

valuePrimitiveDecimalType
    : reocrdPrimitiveDecimalType (',' reocrdPrimitiveDecimalType)*
    ;

reocrdPrimitiveDecimalType
    : pairIdentifier
    ;

/**************************************************************************
        Primitive Double Type
**************************************************************************/
arrPrimitiveDoubleType
    : '[' objPrimitiveDoubleType (',' objPrimitiveDoubleType)* ','? ']'
    ;

objPrimitiveDoubleType
    : '{' pairPrimitiveDoubleType '}'
    ;

pairPrimitiveDoubleType
    : AST_LEXER_PRIMITIVE_DOUBLE_TYPE ':' '{' valuePrimitiveDoubleType '}'
    ;

valuePrimitiveDoubleType
    : reocrdPrimitiveDoubleType (',' reocrdPrimitiveDoubleType)*
    ;

reocrdPrimitiveDoubleType
    : pairIdentifier
    ;

/**************************************************************************
        Primitive Int Type
**************************************************************************/
arrPrimitiveIntType
    : '[' objPrimitiveIntType (',' objPrimitiveIntType)* ','? ']'
    ;

objPrimitiveIntType
    : '{' pairPrimitiveIntType '}'
    ;

pairPrimitiveIntType
    : AST_LEXER_PRIMITIVE_INT_TYPE ':' '{' valuePrimitiveIntType '}'
    ;

valuePrimitiveIntType
    : reocrdPrimitiveIntType (',' reocrdPrimitiveIntType)*
    ;

reocrdPrimitiveIntType
    : pairIdentifier
    ;

/**************************************************************************
        Primitive Long Type
**************************************************************************/
arrPrimitiveLongType
    : '[' objPrimitiveLongType (',' objPrimitiveLongType)* ','? ']'
    ;

objPrimitiveLongType
    : '{' pairPrimitiveLongType '}'
    ;

pairPrimitiveLongType
    : AST_LEXER_PRIMITIVE_LONG_TYPE ':' '{' valuePrimitiveLongType '}'
    ;

valuePrimitiveLongType
    : reocrdPrimitiveLongType (',' reocrdPrimitiveLongType)*
    ;

reocrdPrimitiveLongType
    : pairIdentifier
    ;

/**************************************************************************
        Field Name
**************************************************************************/
arrFieldName
    : '[' objFieldName (',' objFieldName)* ','? ']'
    ;

objFieldName
    : '{' pairFieldName '}'
    ;

pairFieldName
    : AST_LEXER_CLASS_NAME ':' '{' valueFieldName '}'
    ;

valueFieldName
    : reocrdFieldName (',' reocrdFieldName)*
    ;

reocrdFieldName
    : pairIdentifier
    ;

/**************************************************************************
        Field Initializer
**************************************************************************/
arrFieldInitializer
    : '[' objFieldInitializer (',' objFieldInitializer)* ','? ']'
    ;

objFieldInitializer
    : '{' pairFieldInitializer '}'
    ;

pairFieldInitializer
    : AST_LEXER_FIELD_INITIALIZER ':' '{' valueFieldInitializer '}'
    ;

valueFieldInitializer
    : reocrdFieldInitializer (',' reocrdFieldInitializer)*
    ;

reocrdFieldInitializer
    : pairIdentifier          /* TODO */
    ;

/**************************************************************************
        Class Name
**************************************************************************/
arrClassName
    : '[' objClassName (',' objClassName)* ','? ']'
    ;

objClassName
    : '{' pairClassName '}'
    ;

pairClassName
    : AST_LEXER_CLASS_NAME ':' '{' valueClassName '}'
    ;

valueClassName
    : reocrdClassName (',' reocrdClassName)*
    ;

reocrdClassName
    : pairIdentifier
    ;

/**************************************************************************
        COMMON
**************************************************************************/
arrIdentifier
    : '[' objIdentifier (',' objIdentifier)* ','? ']'
    ;

objIdentifier
    : '{' pairIdentifier '}'
    ;

pairIdentifier
    : AST_LEXER_IDENTIFIER ':' '{' valueIdentifier '}'
    ;

valueIdentifier
    : reocrdIdentifier (',' reocrdIdentifier)*
    ;

reocrdIdentifier
    : AST_LEXER_LOGIC ':' STRING
    | AST_LEXER_PHYSICAL ':' STRING
    ;

arrComm
    : '[' objComm (',' objComm)* ','? ']'
    ;

objComm
    : '{' pairIdentifier '}'
    ;

pairComm
    : AST_LEXER_COMM ':' '{' '}'
    ;

valueComm
    : recordComm (',' recordComm)*
    ;

recordComm
    : pairUid
    | pairCreateDate
    | pairModifyDate
    ;

pairUid
    : AST_LEXER_UID ':' STRING
    ;

pairCreateDate
    : AST_LEXER_CREATE_DATE ':' STRING
    ;

pairModifyDate
    : AST_LEXER_MODIFY_DATE ':' STRING
    ;

/**************************************************************************
       Simple Ast LEXER
**************************************************************************/
AST_LEXER_CUSTOM_TYPE
    : '"' 'AstCustomType' '"'
    ;

AST_LEXER_STRING_TYPE
    : '"' 'AstStringType' '"'
    ;

AST_LEXER_PRIMITIVE_DECIMAL_TYPE
    : '"' 'AstPrimitiveDecimalType' '"'
    ;

AST_LEXER_PRIMITIVE_DOUBLE_TYPE
    : '"' 'AstPrimitiveDoubleType' '"'
    ;

AST_LEXER_PRIMITIVE_LONG_TYPE
    : '"' 'AstPrimitiveLongType' '"'
    ;

AST_LEXER_PRIMITIVE_INT_TYPE
    : '"' 'AstPrimitiveIntType' '"'
    ;

AST_LEXER_FIELD_INITIALIZER
    : '"' 'AstFieldInitializer' '"'
    ;

AST_LEXER_FIELD_NAME
    : '"' 'AstFieldName' '"'
    ;

AST_LEXER_FIELD_TYPE
    : '"' 'AstFieldType' '"'
    ;

AST_LEXER_FIELD_DECLARATION
    : '"' 'AstFieldDeclaration' '"'
    ;

AST_LEXER_CLASS_BODY
    : '"' 'AstClassBody' '"'
    ;

AST_LEXER_LOGIC
    : '"' 'AstLogic' '"'
    ;

AST_LEXER_PHYSICAL
    : '"' 'AstPhysical' '"'
    ;

AST_LEXER_IDENTIFIER
    : '"' 'AstIdentifier' '"'
    ;

AST_LEXER_CLASS_NAME
    : '"' 'AstClassName' '"'
    ;

AST_LEXER_CLASS_DECLARATION
    : '"' 'AstClassDeclaration' '"'
    ;

AST_LEXER_COMM
    : '"' 'AstComm' '"'
    ;

AST_LEXER_UID
    : '"' 'AstUid' '"'
    ;

AST_LEXER_CREATE_DATE
    : '"' 'AstCreateDate' '"'
    ;

AST_LEXER_MODIFY_DATE
    : '"' 'AstModifyDate' '"'
    ;

/**************************************************************************
       JSON COMMON LEXER
**************************************************************************/
SINGLE_LINE_COMMENT
   : '//' .*? (NEWLINE | EOF) -> skip
   ;

MULTI_LINE_COMMENT
   : '/*' .*? '*/' -> skip
   ;

LITERAL
   : 'true'
   | 'false'
   | 'null'
   ;

STRING
   : '"' DOUBLE_QUOTE_CHAR* '"'
   | '\'' SINGLE_QUOTE_CHAR* '\''
   ;

fragment DOUBLE_QUOTE_CHAR
   : ~["\\\r\n]
   | ESCAPE_SEQUENCE
   ;

fragment SINGLE_QUOTE_CHAR
   : ~['\\\r\n]
   | ESCAPE_SEQUENCE
   ;

fragment ESCAPE_SEQUENCE
   : '\\'
   ( NEWLINE
   | UNICODE_SEQUENCE       // \u1234
   | ['"\\/bfnrtv]          // single escape char
   | ~['"\\bfnrtv0-9xu\r\n] // non escape char
   | '0'                    // \0
   | 'x' HEX HEX            // \x3a
   )
   ;

IDENTIFIER
   : IDENTIFIER_START IDENTIFIER_PART*
   ;

fragment IDENTIFIER_START
   : [\p{L}]
   | '$'
   | '_'
   | '\\' UNICODE_SEQUENCE
   ;

fragment IDENTIFIER_PART
   : IDENTIFIER_START
   | [\p{M}]
   | [\p{N}]
   | [\p{Pc}]
   | '\u200C'
   | '\u200D'
   ;

fragment UNICODE_SEQUENCE
   : 'u' HEX HEX HEX HEX
   ;

NUMBER
   : SYMBOL
   ( INT ('.' [0-9]*)? EXP? // +1.e2, 1234, 1234.5
   | '.' [0-9]+ EXP?        // -.2e3
   | '0' [xX] HEX+          // 0x12345678
   | 'Infinity'
   | 'NaN'
   )
   ;

fragment SYMBOL
   : ('+' | '-')?
   ;

fragment HEX
   : [0-9a-fA-F]
   ;

fragment INT
   : '0' | [1-9] [0-9]*
   ;

fragment EXP
   : [Ee] SYMBOL INT
   ;

fragment NEWLINE
   : '\r\n'
   | [\r\n\u2028\u2029]
   ;

WS
   : [ \t\n\r] + -> skip
   ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值