• C99 表达式 + Lexer部分 Grammar


    /*============================================================================
     Name        : CExpression.g
     Author      : luqi
     Version     : 0.1
     Copyright   : Your copyright notice
     Description : C99 - Expression - have tested <C99.pdf 6.5>
                   mock type_name and initializer_list rule
     ============================================================================*/

    grammar CExpression;

    options {
      language = Java;
      superClass = DebugParser;
      //@ superClass = DebugLexer;
      //output = AST;
    }

    @header
    {
    package c99.cexpression;
    import util.DebugParser;
    }

    @lexer::header
    {
    package c99.cexpression;
    import util.DebugLexer;
    }


    /*==========================================================================================================
     *  Mock Grammar for type_name and initializer_list
     *=========================================================================================================*/
    type_name   :   'type_name'
                ;
                
    initializer_list : 'initializer_list'
                     ;

    /*==========================================================================================================
    *  Expression Grammar
    *=========================================================================================================*/
     
    primary_expression  : IDENTIFIER
                        | CONSTANT
                        | STRING_LITERAL
                        | '(' expression ')'
                        ;
                        
    postfix_expression  : primary_expression                                 
                            (   '[' expression ']'                  
                            |   '(' argument_expression_list ? ')'  
                            |   '.' IDENTIFIER                    
                            |   '->' IDENTIFIER                   
                            |   '++'                              
                            |   '--'
                            |   '(' type_name ')' '{' initializer_list ','? '}'
                            )*                              
                        ;
                        
    argument_expression_list  : assignment_expression (',' assignment_expression)*
                              ;
                              
    unary_expression  : postfix_expression
                      | '++' unary_expression
                      | '--' unary_expression
                      | unary_operator cast_expression
                      | 'sizeof' unary_expression
                      | 'sizeof' '(' type_name ')'
                      ;
                      
    unary_operator  :   '&'
                    |   '*'
                    |   '+'
                    |   '-'
                    |   '~'
                    |   '!'
                    ;
     
    cast_expression :   unary_expression
                    |   '(' type_name ')' cast_expression
                    ;
                      
    multiplicative_expression   :   cast_expression
                                        (('*' | '/' |  '%') cast_expression)*
                                ;
                                
    additive_expression :   multiplicative_expression
                                (('+' | '-') multiplicative_expression)*
                        ;
                        
    shift_expression    :   additive_expression
                                (('<<' | '>>') additive_expression)*
                        ;
                        
    relational_expression   :   shift_expression
                                    (('<' | '>' | '<=' | '>=') shift_expression)*
                            ;
                        
    equality_expression :   relational_expression
                                (('==' | '!=') relational_expression)*
                        ;
     
    and_expression  :   equality_expression ( '&' equality_expression)*
                    ;
     
    exclusive_or_expression :   and_expression  ( '^' and_expression)*
                            ;
                            
    inclusive_or_expression :   exclusive_or_expression
                                    ( '|' exclusive_or_expression)*
                            ;
                    
    logical_and_expression  :   inclusive_or_expression
                                    ( '&&' inclusive_or_expression)*
                            ;
                            
    logical_or_expression   :   logical_and_expression
                                    ( '||' logical_and_expression)*
                            ;
                            
    conditional_expression  :   logical_or_expression
                                    ('?' expression ':' conditional_expression)?
                            ;
                            
    assignment_expression   :  (unary_expression assignment_operator assignment_expression)=>unary_expression assignment_operator assignment_expression
                            |  conditional_expression   
                            ;

    assignment_operator :   '='
                        |   '*='
                        |   '/='
                        |   '%='
                        |   '+='
                        |   '-='
                        |   '<<='
                        |   '>>='
                        |   '&='
                        |   '^='
                        |   '|='
                        ;
     
    expression  :   assignment_expression
                        (',' assignment_expression) *
                ;
                
               
                            
    constant_expression :   conditional_expression
                        ;   
                     
     /*==========================================================================================================
     *  Lexer Grammar
     *=========================================================================================================*/

    KEYWORD :     'auto'        | 'break'       | 'case'        | 'char'        | 'const'       | 'continue'
                | 'default'     | 'do'          | 'double'      | 'else'        | 'enum'        | 'extern'
                | 'float'       | 'for'         | 'goto'        | 'if'          | 'inline'      | 'int'
                | 'long'        | 'register'    | 'restrict'    | 'return'      | 'short'       | 'signed'
                | 'sizeof'      | 'static'      | 'struct'      | 'switch'      | 'typedef'     | 'union'
                | 'unsigned'    | 'void'        | 'volatile'    | 'while'       | '_Bool'       | '_Complex'
                | '_Imaginary'
                ;
                
    IDENTIFIER  :   IDENTIFIER_NONDIGIT ( IDENTIFIER_NONDIGIT | DIGIT ) *
                ;
                
    fragment   
    IDENTIFIER_NONDIGIT :   NONDIGIT
                        |   UNIVERSAL_CHARACTER_NAME
                        ;
                        
    fragment        
    NONDIGIT    :   'a' .. 'z'
                |   'A' .. 'Z'
                |   '_'
                ;
    fragment           
    DIGIT   :   '0' .. '9'
            ;

    fragment        
    UNIVERSAL_CHARACTER_NAME    :   '\\u' HEX_QUAD
                                |   '\\U' HEX_QUAD HEX_QUAD
                                ;
    fragment     
    HEX_QUAD    :   HEXADECIMAL_DIGIT HEXADECIMAL_DIGIT HEXADECIMAL_DIGIT HEXADECIMAL_DIGIT
                ;
                
    CONSTANT    :   INTEGER_CONSTANT
                |   FLOATING_CONSTANT
              //|   ENUMERATION_CONSTANT
                |   CHARACTER_CONSTANT
                ;
                
    fragment            
    INTEGER_CONSTANT    :   DECIMAL_CONSTANT INTEGER_SUFFIX ?
                        |   OCTAL_CONSTANT INTEGER_SUFFIX ?
                        |   HEXADECIMAL_CONSTANT INTEGER_SUFFIX ?
                        ;
    fragment                   
    INTEGER_SUFFIX  :   UNSIGNED_SUFFIX LONG_SUFFIX ?
                    |   UNSIGNED_SUFFIX LONG_LONG_SUFFIX
                    |   LONG_SUFFIX UNSIGNED_SUFFIX ?
                    |   LONG_LONG_SUFFIX UNSIGNED_SUFFIX    ?  
                    ;
    fragment                
    UNSIGNED_SUFFIX : 'u'
                    | 'U'
                    ;
    fragment                
    LONG_SUFFIX     :   'l'
                    |   'L'
                    ;
    fragment                
    LONG_LONG_SUFFIX    :   'll'
                        |   'LL'
                        ;
    fragment                   
    DECIMAL_CONSTANT    :   NONZERO_DIGIT (DIGIT) *
                        ;
    fragment       
    OCTAL_CONSTANT  :   '0' (OCTAL_DIGIT) *
                    ;
    fragment                
    HEXADECIMAL_CONSTANT    :   HEXADECIMAL_PREFIX ( HEXADECIMAL_DIGIT )+
                            ;
     
    fragment
    HEXADECIMAL_PREFIX  :   '0x'
                        |   '0X'
                        ;
    fragment        
    NONZERO_DIGIT   : '1' .. '9'
                    ;
    fragment               
    OCTAL_DIGIT :   '0' .. '7'   
                ;
                
    fragment
    HEXADECIMAL_DIGIT   :   '0' .. '9'
                        |   'a' .. 'f'
                        |   'A' .. 'F'  
                        ;

    fragment     
    FLOATING_CONSTANT   :   DECIMAL_FLOATING_CONSTANT
                        |   HEXADECIMAL_FLOATING_CONSTANT    
                        ;
                        
    fragment                   
    DECIMAL_FLOATING_CONSTANT   :   FRACTIONAL_CONSTANT EXPONENT_PART ? FLOATING_SUFFIX ?
                                |   DIGIT_SEQUENCE EXPONENT_PART FLOATING_SUFFIX ?
                                ;
    fragment                            
    FRACTIONAL_CONSTANT :   DIGIT_SEQUENCE ? '.' DIGIT_SEQUENCE
                        |   DIGIT_SEQUENCE '.'
                        ;
    fragment                    
    EXPONENT_PART   :   'e' SIGN ? DIGIT_SEQUENCE
                    |   'E' SIGN ? DIGIT_SEQUENCE
                    ;
    fragment                
    SIGN    :   '+'
            |   '-'
            ;
            
    fragment        
    DIGIT_SEQUENCE  :   DIGIT +
                    ;
    fragment       
    HEXADECIMAL_FLOATING_CONSTANT   :   HEXADECIMAL_PREFIX HEXADECIMAL_FRACTIONAL_CONSTANT BINARY_EXPONENT_PART FLOATING_SUFFIX ?
                                    |   HEXADECIMAL_PREFIX HEXADECIMAL_DIGIT_SEQUENCE BINARY_EXPONENT_PART FLOATING_SUFFIX ?
                                    ;
    fragment                                
    HEXADECIMAL_FRACTIONAL_CONSTANT :   HEXADECIMAL_DIGIT_SEQUENCE ? '.' HEXADECIMAL_DIGIT_SEQUENCE
                                    |   HEXADECIMAL_DIGIT_SEQUENCE '.'
                                    ;
    fragment       
    BINARY_EXPONENT_PART    :   'p' SIGN ? DIGIT_SEQUENCE
                            |   'P' SIGN ? DIGIT_SEQUENCE
                            ;
    fragment                        
    HEXADECIMAL_DIGIT_SEQUENCE  :   HEXADECIMAL_DIGIT +
                                ;
                                
    fragment                            
    FLOATING_SUFFIX :   'f'
                    |   'l'
                    |   'F'
                    |   'L'
                    ;

    //fragment       
    //ENUMERATION_CONSTANT    :   IDENTIFIER
    //                        ;
     
    fragment  
    CHARACTER_CONSTANT  :   '\'' C_CHAR_SEQUENCE '\''
                        |   'L\'' C_CHAR_SEQUENCE '\''
                        ;
    fragment                   
    C_CHAR_SEQUENCE :   C_CHAR +
                    ;
    fragment        
    C_CHAR  :   ~('\'' | '\\' )
            |   ESCAPE_SEQUENCE
            ;
            
    fragment        
    ESCAPE_SEQUENCE :   SIMPLE_ESCAPE_SEQUENCE
                    |   OCTAL_ESCAPE_SEQUENCE
                    |   HEXADECIMAL_ESCAPE_SEQUENCE
                    |   UNIVERSAL_CHARACTER_NAME
                    ;
                    
    fragment                
    SIMPLE_ESCAPE_SEQUENCE  :   '\\' ( '\'' | '"' | '?' | '\\' | 'a' | 'b' | 'f' | 'n' | 'r' | 't' | 'v'  )
                            ;
    fragment
    OCTAL_ESCAPE_SEQUENCE   :  '\\'  OCTAL_DIGIT                  //  OCTAL_DIGIT OCTAL_DIGIT ?  OCTAL_DIGIT ?
                            |  '\\'  OCTAL_DIGIT OCTAL_DIGIT
                            |  ('\\' OCTAL_DIGIT OCTAL_DIGIT  OCTAL_DIGIT )=> '\\'  OCTAL_DIGIT OCTAL_DIGIT  OCTAL_DIGIT
                            ;
       
    fragment        
    HEXADECIMAL_ESCAPE_SEQUENCE :   '\\x' HEXADECIMAL_DIGIT +
                                ;
     
    STRING_LITERAL  :   '"'  S_CHAR_SEQUENCE ? '"'
                    |   'L"' S_CHAR_SEQUENCE ? '"'
                    ;
     
    fragment                
    S_CHAR_SEQUENCE :  S_CHAR +  
                    ;

    fragment
    S_CHAR  :    ~('"' | '\\' )    
            |    ESCAPE_SEQUENCE
            ;


    SINGLELINECOMMENT   :    '//' (~('\n'|'\r'))* ('\n'|'\r'('\n')?)? {$channel=HIDDEN;}
                        ;
                        
                        
    MULTILINECOMMENT  : '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
                      ;
          
                        
    WS  :  (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}
        ;
        
        

  • 相关阅读:
    Comet OJ
    LOJ#2719. 「NOI2018」冒泡排序 DP+组合+树状数组
    LuoguP6747 『MdOI R3』Teleport 二进制+贪心
    LuoguP6748 『MdOI R3』Fallen Lord 树形DP+set
    LuoguP5576 [CmdOI2019]口头禅 后缀树+线段树+暴力
    LOJ#3161. 「NOI2019」I 君的探险 整体二分+随机化+二进制分组
    LOJ#2085. 「NOI2016」循环之美 莫比乌斯反演+杜教筛
    LuoguP5327 [ZJOI2019]语言 线段树合并+树链求并
    【考试题
    ELK
  • 原文地址:https://www.cnblogs.com/quixotic/p/2269497.html
Copyright © 2020-2023  润新知