All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.puresoltechnologies.purifinity.server.plugin.c11.grammar.C11.g Maven / Gradle / Ivy

The newest version!
/****************************************************************************
 * C 11 Grammar File for Nyota Uhura
 * (c) by 2012 PureSol Technologies
 * Author: Rick-Rainer Ludwig
 ****************************************************************************/ 

/*
 * This grammar was extracted from the OpenStd.org's document n1570.pdf which
 * contains the draft for C11.
 */

/****************************************************************************
 * O P T I O N S
 ****************************************************************************/ 
OPTIONS
	grammar.name="C 11";
	grammar.checks=true;
	grammar.ignore-case=false;
	grammar.ignored-leading=true;
	grammar.normalize_to_bnf=true;					// defines whether the grammar needs to be normalized to BNF
	preprocessor.use=false;							// usage of preprocessor required? 
	//preprocessor="com.puresoltechnologies.purifinity.coding.lang.cpp.CPreprocessor";								// usage of preprocessor required? 
	lexer="com.puresoltechnologies.parsers.lexer.RegExpLexer";
	parser="com.puresoltechnologies.parsers.parser.packrat.PackratParser";
	parser.backtracking=true;

/****************************************************************************
 * H E L P E R
 ****************************************************************************/ 
HELPER

	/*
	 * 6.4.9 Comments
	 */
		
	TraditionalComment:
		"/\\*" CommentTail
	;
		
	EndOfLineComment:
		"//" CharactersInLine LineTerminator  
	;
		
	CommentTail:
		"(" NotStar "|\\*(?!/))*\\*/"
	;
		
	NotStar:
		"[^*]"
	;
		
	CharactersInLine:
		InputCharacter "*"
	;
	
	InputCharacter: "[^\\n\\r]" ;

    /*
     * 6.4.2 Identifiers
     */
    identifier-nondigit:
        nondigit
    |   universal-character-name
    // |   other implementation-defined characters
    ;
    
    nondigit:
		"[_a-zA-Z]"
    ;

    digit:
        "[0-9]" 
    ;

    /*
     * 6.4.3 Universal character names
     */
    universal-character-name:
        "\\\\u" hex-quad
    |   "\\\\U" hex-quad hex-quad
    ;
    
    hex-quad:
        hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit
    ;

    /*
     * 6.4.4.1 Integer constants
     */
    decimal-constant:
        nonzero-digit digit*
    ;

    octal-constant:
        '0' octal-digit*
    ;
    
    hexadecimal-constant:
        hexadecimal-prefix hexadecimal-digit+
    ;
    
    hexadecimal-prefix: "0[xX]";
    nonzero-digit: "[1-9]";
    octal-digit: "[0-7]";
	hexadecimal-digit: "[0-9a-fA-F]";

    integer-suffix:
        unsigned-suffix long-suffix?
    |   unsigned-suffix long-long-suffix
    |   long-suffix unsigned-suffix?
    |   long-long-suffix unsigned-suffix?
    ;
    
    unsigned-suffix: "[uU]";
    long-suffix: "[lL]";
    long-long-suffix: "(ll|LL)";

    /*
     * 6.4.4.2 Floating constants
     */
    decimal-floating-constant:
        fractional-constant exponent-part? floating-suffix?
    |   digit-sequence exponent-part floating-suffix?
    ;
    
    hexadecimal-floating-constant:
        hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part floating-suffix?
    |   hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part floating-suffix?
    ;
    
    fractional-constant:
        digit-sequence? '.' digit-sequence
    |   digit-sequence '.'
    ;
    
    exponent-part:
        "[eE]" sign? digit-sequence
    ;

    sign: "[+-]";
    digit-sequence:
        digit+
    ;
    
    hexadecimal-fractional-constant:
        hexadecimal-digit-sequence? '.' hexadecimal-digit-sequence
    |   hexadecimal-digit-sequence '.'
    ;
    
    binary-exponent-part:
        "[pP]" sign? digit-sequence
    ;
    
    hexadecimal-digit-sequence:
        hexadecimal-digit+
    ;
    
    floating-suffix: "[flFL]";
   
    /*
     * 6.4.4.4 Character constants
     */
    c-char-sequence:
        c-char+
    ;
    
    c-char:
        "[^'\\\\\\n]"
    |   escape-sequence
    ;
    
    escape-sequence:
        simple-escape-sequence
    |   octal-escape-sequence
    |   hexadecimal-escape-sequence
    |   universal-character-name
    ;
    
    simple-escape-sequence: "\\\\['\\\\\"?\\\\abfnrtv]";

    octal-escape-sequence:
        "\\\\" octal-digit
    |   "\\\\" octal-digit octal-digit
    |   "\\\\" octal-digit octal-digit octal-digit
    ;
    
    hexadecimal-escape-sequence:
        "\\\\x" hexadecimal-digit+
    ;

    /*
     * 6.4.5 String literals
     */
    encoding-prefix: "(u8|[uUL])";

    s-char-sequence:
        s-char*
    ;
    
    s-char:
        "[^\"\\\\\\n]"
    |   escape-sequence
    ;

    /*
     * 6.4.7 Header names
     */
    h-char-sequence:
        h-char+
    ;
    
    h-char: "[^\\n>]";
    
    q-char-sequence:
        q-char+
    ;
    
    q-char: "[^\\n\"]";

 /****************************************************************************
 * T O K E N S
 ****************************************************************************/ 
 TOKENS
 
 	WhiteSpace:
		"( |\\t|\\f)" [ignore]
	;
 
    LineTerminator:
        "(\\n|\\r\\n|\\r)" [ignore]
    ;

    LineConcatenation:
        BACKSLASH LineTerminator [ignore]
    ;
 
    /*
 	 * 6.4.9 Comments
 	 */
 	Comment:
		"(" TraditionalComment "|" EndOfLineComment ")" [ignore]
	;
 
 	/*
	 * 6.4.6 Punctuators
	 */
	LRECTANGULAR: "\\[" ;
	RRECTANGULAR: "\\]" ;
	LPAREN: "\\(" ;
	RPAREN: "\\)" ;
	LCURLY: "\\{" ;
	RCURLY: "\\}" ;
	DOT: "\\." ;
	AMPERSAND: "&" ;
	STAR: "\\*" ;
	PLUS: "\\+" ;
	MINUS: "-";
	TILDE : "~" ;
	EXCLAMATION_MARK: "!" ;
	SLASH: "/" ;
	PERCENT: "%";
	LESS_THAN: "<" ;
	GREATER_THAN: ">" ;
	CARET: "\\^" ;
	VERTICAL_BAR : "\\|" ;
	QUESTION_MARK : "\\?" ;
	COLON: ":" ;
	SEMICOLON: ";" ;
	EQUALS: "=" ;
	COMMA: "," ;
	SHARP: "#" ;
	BACKSLASH: "\\\\" ;
 
    /*
     * 6.4.1 Keywords
     */
    AUTO           : "auto(?!\\w)" ;
    BREAK          : "break(?!\\w)" ;
    CASE           : "case(?!\\w)" ;
    CHAR           : "char(?!\\w)" ;
    CONST          : "const(?!\\w)" ;
    CONTINUE       : "continue(?!\\w)" ;
    DEFAULT        : "default(?!\\w)" ;
    DO             : "do(?!\\w)" ;
    DOUBLE         : "double(?!\\w)" ;
    ELSE           : "else(?!\\w)" ;
    ENUM           : "enum(?!\\w)" ;
    EXTERN         : "extern(?!\\w)" ;
    FLOAT          : "float(?!\\w)" ;
    FOR            : "for(?!\\w)" ;
    GOTO           : "goto(?!\\w)" ;
    IF             : "if(?!\\w)" ;
    INLINE         : "inline(?!\\w)" ;
    INT            : "int(?!\\w)" ;
    LONG           : "long(?!\\w)" ;
    REGISTER       : "register(?!\\w)" ;
    RESTRICT       : "restrict(?!\\w)" ;
    RETURN         : "return(?!\\w)" ;
    SHORT          : "short(?!\\w)" ;
    SIGNED         : "signed(?!\\w)" ;
    SIZEOF         : "sizeof(?!\\w)" ;
    STATIC         : "static(?!\\w)" ;
    STRUCT         : "struct(?!\\w)" ;
    SWITCH         : "switch(?!\\w)" ;
    TYPEDEF        : "typedef(?!\\w)" ;
    UNION          : "union(?!\\w)" ;
    UNSIGNED       : "unsigned(?!\\w)" ;
    VOID           : "void(?!\\w)" ;
    VOLATILE       : "volatile(?!\\w)" ;
    WHILE          : "while(?!\\w)" ;
    _ALIGNAS       : "_Alignas(?!\\w)" ;
    _ALIGNOF       : "_Alignof(?!\\w)" ;
    _ATOMIC        : "_Atomic(?!\\w)" ;
    _BOOL          : "_Bool(?!\\w)" ;
    _COMPLEX       : "_Complex(?!\\w)" ;
    _GENERIC       : "_Generic(?!\\w)" ;
    _IMAGINARY     : "_Imaginary(?!\\w)" ;
    _NORETURN      : "_Noreturn(?!\\w)" ;
    _STATIC_ASSERT : "_Static_assert(?!\\w)" ;
    _THREAD_LOCAL  : "_Thread_local(?!\\w)" ;

    PP_IF : "#\\s*if(?!\\w)";
    PP_IFDEF : "#\\s*ifdef(?!\\w)";
    PP_IFNDEF : "#\\s*ifndef(?!\\w)";
    PP_ELIF : "#\\s*elif(?!\\w)";
    PP_ELSE : "#\\s*else(?!\\w)";
    PP_ENDIF : "#\\s*endif(?!\\w)";
    PP_INCLUDE : "#\\s*include(?!\\w)";
    PP_DEFINE : "#\\s*define(?!\\w)";
    PP_UNDEF : "#\\s*undef(?!\\w)";
    PP_LINE : "#\\s*line(?!\\w)";
    PP_ERROR : "#\\s*error(?!\\w)";
    PP_PRAGMA : "#\\s*pragma(?!\\w)";
    
    /*
     * 6.4.4.1 Integer constants
     */
    integer-constant:
        decimal-constant integer-suffix?
    |   octal-constant integer-suffix?
    |   hexadecimal-constant integer-suffix?
    ;
    
    /*
     * 6.4.4.2 Floating constants
     */
    floating-constant:
        decimal-floating-constant
    |   hexadecimal-floating-constant
    ;
    
    /*
     * 6.4.4.3 Enumeration constants
     */
    enumeration-constant:
        identifier
    ;
    
    /*
     * 6.4.4.4 Character constants
     */
    character-constant:
        "'" c-char-sequence "'"
    |   "L'" c-char-sequence "'"
    |   "u'" c-char-sequence "'"
    |   "U'" c-char-sequence "'"
    ;

    /*
     * 6.4.5 String literals
     */
    string-literal:
        encoding-prefix? "\"" s-char-sequence "\""
    ;

    /*
     * 6.4.7 Header names
     */
    header-name:
        "<" h-char-sequence ">"
    |   "\"" q-char-sequence "\""
    ;

    /*
     * 6.4.8 Preprocessing numbers
     */
    pp-number:
        "(" digit "|\\." digit ")" "(" digit "|" identifier-nondigit "|[eEpP]" sign "|\\.)*"
    ;

    /*
     * 6.4.2 Identifiers
     */
    identifier :
        identifier-nondigit "(" identifier-nondigit "|" digit ")*"
    ;

/****************************************************************************
 * P R O D U C T I O N S
 ****************************************************************************/ 
 PRODUCTIONS
 
 	_START_ : 
        translation-unit 
 	;

    /**********************
     * 6.4 Lexical elements
     **********************/
    
    token:
        keyword
	|	identifier
	|	constant
	|	string-literal
	|	punctuator
	;

	preprocessing-token:
		header-name
	|	identifier
	|	pp-number
	|	character-constant
	|	string-literal
	|	punctuator
	|	"."
    ;

    punctuator :
        LRECTANGULAR
    |	RRECTANGULAR
    |	LPAREN
    |	RPAREN
    |	LCURLY
    |	RCURLY
    |	DOT
    |	AMPERSAND
    |	STAR
    |	PLUS
    |	MINUS
    |	TILDE
    |	EXCLAMATION_MARK
    |	SLASH
    |	PERCENT
    |	LESS_THAN
    |	GREATER_THAN
    |	CARET
    |	VERTICAL_BAR
    |	QUESTION_MARK
    |	COLON
    |	SEMICOLON
    |	EQUALS
    |	COMMA
    |	SHARP
    ;
    
    /*
     * 6.4.1 Keywords
     */
    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
    |   _ALIGNAS
    |   _ALIGNOF
    |   _ATOMIC
    |   _BOOL
    |   _COMPLEX
    |   _GENERIC
    |   _IMAGINARY
    |   _NORETURN
    |   _STATIC_ASSERT
    |   _THREAD_LOCAL
    ;
    
    /*
     * 6.4.4 Constants
     */
    constant:
        integer-constant
    |   floating-constant
    |   enumeration-constant
    |   character-constant
    ;

    /*****************
     * 6.5 Expressions
     *****************/
     
    primary-expression:
        identifier
    |   constant
    |   string-literal
    |   LPAREN expression RPAREN
    |   generic-selection
    ;

    generic-selection:
        _GENERIC LPAREN assignment-expression COMMA generic-assoc-list RPAREN
    ;
    
    generic-assoc-list:
        generic-association
    |   generic-assoc-list COMMA generic-association
    ;
    
    generic-association:
        type-name COLON assignment-expression
    |   DEFAULT COLON assignment-expression
    ;
    
    postfix-expression:
        primary-expression
    |   postfix-expression LRECTANGULAR expression RRECTANGULAR
    |   postfix-expression LPAREN argument-expression-list? RPAREN
    |   postfix-expression COMMA identifier
    |   postfix-expression MINUS GREATER_THAN identifier
    |   postfix-expression PLUS PLUS
    |   postfix-expression MINUS MINUS
    |   LPAREN type-name RPAREN LCURLY initializer-list RCURLY
    |   LPAREN type-name RPAREN LCURLY initializer-list COMMA RCURLY
    ;
    
    argument-expression-list:
        assignment-expression
    |   argument-expression-list COMMA assignment-expression
    ;
    
    unary-expression:
        postfix-expression
    |   PLUS PLUS unary-expression
    |   MINUS MINUS unary-expression
    |   unary-operator cast-expression
    |   SIZEOF unary-expression
    |   LPAREN type-name RPAREN
    |   _ALIGNOF LPAREN type-name RPAREN
    ;
        
    unary-operator: 
        AMPERSAND
    |   STAR
    |   PLUS
    |   MINUS
    |   TILDE
    |   EXCLAMATION_MARK
    ;
    
    cast-expression:
        unary-expression
    |   LPAREN type-name RPAREN cast-expression
    ;
    
    multiplicative-expression:
        cast-expression
    |   multiplicative-expression STAR cast-expression
    |   multiplicative-expression SLASH cast-expression
    |   multiplicative-expression PERCENT cast-expression
    ;
    
    additive-expression:
        multiplicative-expression
    |   additive-expression PLUS multiplicative-expression
    |   additive-expression MINUS multiplicative-expression
    ;
    
    shift-expression:
        additive-expression
    |   shift-expression LESS_THAN LESS_THAN additive-expression
    |   shift-expression GREATER_THAN GREATER_THAN additive-expression
    ;
    
    relational-expression:
        shift-expression
    |   relational-expression LESS_THAN shift-expression
    |   relational-expression GREATER_THAN shift-expression
    |   relational-expression LESS_THAN EQUALS shift-expression
    |   relational-expression GREATER_THAN EQUALS shift-expression
    ;
    
    equality-expression:
        relational-expression
    |   equality-expression EQUALS EQUALS relational-expression
    |   equality-expression EXCLAMATION_MARK EQUALS relational-expression
    ;
    
    AND-expression:
        equality-expression
    |   AND-expression AMPERSAND equality-expression
    ;
    
    exclusive-OR-expression:
        AND-expression
    |   exclusive-OR-expression CARET AND-expression
    ;
    
    inclusive-OR-expression:
        exclusive-OR-expression
    |   inclusive-OR-expression VERTICAL_BAR exclusive-OR-expression
    ;
    
    logical-AND-expression:
        inclusive-OR-expression
    |   logical-AND-expression AMPERSAND AMPERSAND inclusive-OR-expression
    ;

    logical-OR-expression:
        logical-AND-expression
    |   logical-OR-expression VERTICAL_BAR VERTICAL_BAR logical-AND-expression
    ;
    
    conditional-expression:
        logical-OR-expression
    |   logical-OR-expression QUESTION_MARK expression COLON conditional-expression
    ;
    
    assignment-expression:
        conditional-expression
    |   unary-expression assignment-operator assignment-expression
    ;
    
    assignment-operator: 
        EQUALS
    |   STAR EQUALS
	|   SLASH EQUALS
	|   PERCENT EQUALS
	|   PLUS EQUALS
    |   MINUS EQUALS
    |   LESS_THAN LESS_THAN EQUALS
    |   GREATER_THAN GREATER_THAN EQUALS
    |   AMPERSAND EQUALS
    |   CARET EQUALS
    |   VERTICAL_BAR EQUALS
    ;
    
    expression:
        assignment-expression
    |   expression COMMA assignment-expression
    ;
    
    /**************************
     * 6.6 Constant expressions
     **************************/
    
    constant-expression:
        conditional-expression
    ;
    
    /******************
     * 6.7 Declarations
     ******************/
     
     declaration:
          declaration-specifiers init-declarator-list? SEMICOLON
     |    static_assert-declaration
     ;
     
     declaration-specifiers:
          storage-class-specifier declaration-specifiers?
     |    type-specifier declaration-specifiers?
     |    type-qualifier declaration-specifiers?
     |    function-specifier declaration-specifiers?
     |    alignment-specifier declaration-specifiers?
     ;
     
     init-declarator-list:
          init-declarator
     |    init-declarator-list COMMA init-declarator
     ;
     
     init-declarator:
          declarator
     |    declarator EQUALS initializer
     ;
     
     storage-class-specifier:
          TYPEDEF
     |    EXTERN
     |    STATIC
     |    _THREAD_LOCAL
     |    AUTO
     |    REGISTER
     ;
    
    type-specifier:
        VOID
    |   CHAR
    |   SHORT
    |   INT
    |   LONG
    |   FLOAT
    |   DOUBLE
    |   SIGNED
    |   UNSIGNED
    |   _BOOL
    |   _COMPLEX
    |   atomic-type-specifier
    |   struct-or-union-specifier
    |   enum-specifier
    |   typedef-name
    ;
    
    struct-or-union-specifier:
        struct-or-union identifier? LCURLY struct-declaration-list RCURLY
    |   struct-or-union identifier
    ;

    struct-or-union:
        STRUCT
    |   UNION
    ;
    
    struct-declaration-list:
        struct-declaration
    |   struct-declaration-list struct-declaration
    ;
    
    struct-declaration:
        specifier-qualifier-list struct-declarator-list? SEMICOLON
    |   static_assert-declaration
    ;
    
    specifier-qualifier-list:
        type-specifier specifier-qualifier-list?
    |   type-qualifier specifier-qualifier-list?
    ;
    
    struct-declarator-list:
        struct-declarator
    |   struct-declarator-list COMMA struct-declarator
    ;
    
    struct-declarator:
        declarator
        declarator? COLON constant-expression
    ;
    
    enum-specifier:
        ENUM identifier? LCURLY enumerator-list RCURLY
    |   ENUM identifier? LCURLY enumerator-list COMMA RCURLY
    |   ENUM identifier
    ;
    
    enumerator-list:
        enumerator
    |   enumerator-list COMMA enumerator
    ;
    
    enumerator:
        enumeration-constant
    |   enumeration-constant EQUALS constant-expression
    ;
    
    atomic-type-specifier:
        _ATOMIC LPAREN type-name RPAREN
    ;
    
    type-qualifier:
        CONST
    |   RESTRICT
    |   VOLATILE
    |   _ATOMIC
    ;
    
    function-specifier:
        INLINE
    |   _NORETURN
    ;
    
    alignment-specifier:
        _ALIGNAS LPAREN type-name RPAREN
    |   _ALIGNAS LPAREN constant-expression RPAREN
    ;
    
    declarator:
        pointer? direct-declarator
    ;
    
    direct-declarator:
        identifier
    |   LPAREN declarator RPAREN
    |   direct-declarator LRECTANGULAR type-qualifier-list? assignment-expression? RRECTANGULAR
    |   direct-declarator LRECTANGULAR STATIC type-qualifier-list? assignment-expression RRECTANGULAR
    |   direct-declarator LRECTANGULAR type-qualifier-list STATIC assignment-expression RRECTANGULAR
    |   direct-declarator LRECTANGULAR type-qualifier-list? STAR RRECTANGULAR
    |   direct-declarator LPAREN parameter-type-list RPAREN
    |   direct-declarator LPAREN identifier-list? RPAREN
    ;
    
    pointer:
        STAR type-qualifier-list?
    |   STAR type-qualifier-list? pointer
    ;
    
    type-qualifier-list:
        type-qualifier
    |   type-qualifier-list type-qualifier
    ;
    
    parameter-type-list:
        parameter-list
    |   parameter-list COMMA DOT DOT DOT
    ;
    
    parameter-list:
        parameter-declaration
    |   parameter-list COMMA parameter-declaration
    ;
       
    parameter-declaration:
        declaration-specifiers declarator
    |   declaration-specifiers abstract-declarator?
    ;
    
    identifier-list:
        identifier
    |   identifier-list COMMA identifier
    ;
    
    type-name:
        specifier-qualifier-list abstract-declarator?
    ;
    
    abstract-declarator:
        pointer
    |   pointer? direct-abstract-declarator
    ;
    
    direct-abstract-declarator:
        LPAREN abstract-declarator RPAREN
    |   direct-abstract-declarator? LRECTANGULAR type-qualifier-list? assignment-expression? RRECTANGULAR
    |   direct-abstract-declarator? LRECTANGULAR STATIC type-qualifier-list? assignment-expression RRECTANGULAR
    |   direct-abstract-declarator? LRECTANGULAR type-qualifier-list STATIC assignment-expression RRECTANGULAR
    |   direct-abstract-declarator? LRECTANGULAR STAR RRECTANGULAR
    |   direct-abstract-declarator? LPAREN parameter-type-list? RPAREN
    ;
    
    typedef-name:
        identifier
    ;
    
    initializer:
        assignment-expression
    |   LCURLY initializer-list RCURLY
    |   LCURLY initializer-list COMMA RCURLY
    ;
    
    initializer-list:
        designation? initializer
    |   initializer-list COMMA designation? initializer
    ;
    
    designation:
        designator-list EQUALS
    ;
    
    designator-list:
        designator
    |   designator-list designator
    ;
    
    designator:
        LRECTANGULAR constant-expression RRECTANGULAR
    |   DOT identifier
    ;
    
    static_assert-declaration:
        _STATIC_ASSERT LPAREN constant-expression COMMA string-literal RPAREN SEMICOLON
    ;
    
    /***************************
     * 6.8 Statements and blocks
     ***************************/
    
    statement:
        labeled-statement
    |   compound-statement
    |   expression-statement
    |   selection-statement
    |   iteration-statement
    |   jump-statement
    ;
    
    labeled-statement:
        identifier COLON statement
    |   CASE constant-expression COLON statement
    |   statement
    ;
    
    compound-statement:
        LCURLY block-item-list? RCURLY
    ;
    
    block-item-list:
        block-item
    |   block-item-list block-item
    ;
    
    block-item:
        declaration
    |   statement
    ;
    
    expression-statement:
        expression? SEMICOLON
    ;
    
    selection-statement:
        IF LPAREN expression RPAREN statement
    |   IF LPAREN expression RPAREN statement ELSE statement
    |   SWITCH LPAREN expression RPAREN statement
    ;
    
    iteration-statement:
        WHILE LPAREN expression RPAREN statement
    |   DO statement WHILE LPAREN expression RPAREN SEMICOLON
    |   FOR LPAREN expression? SEMICOLON expression? SEMICOLON expression? RPAREN statement
    |   FOR LPAREN declaration expression SEMICOLON expression RPAREN statement
    ;
    
    jump-statement:
        GOTO identifier SEMICOLON
    |   CONTINUE SEMICOLON
    |   BREAK SEMICOLON
    |   RETURN expression? SEMICOLON
    ;

    /**************************
     * 6.9 External definitions
     **************************/
    
    translation-unit:
        external-declaration
    |   translation-unit external-declaration
    ;
    
    external-declaration:
        function-definition
    |   declaration
    ;
    
    function-definition:
        declaration-specifiers declarator declaration-list? compound-statement
    ;
    
    declaration-list:
        declaration
    |   declaration-list declaration
    ;
    
    /*******************************
     * 6.10 Preprocessing directives
     *******************************/
    
    preprocessing-file:
        group?
    ;
    
    group:
        group-part
    |   group group-part
    ;
    
    group-part:
        if-section
    |   control-line
    |   non-directive-line // added for better separation of group parts
    |   text-line
    ;
    
    if-section:
        if-group elif-groups ? else-group ? endif-line
    ;
    
    if-group:
        PP_IF constant-expression new-line group ?
    |   PP_IFDEF identifier new-line group ?
    |   PP_IFNDEF identifier new-line group ?
    ;
    
    elif-groups:
        elif-group
    |   elif-groups elif-group
    ;
    
    elif-group:
        PP_ELIF constant-expression new-line group?
    ;
    
    else-group:
        PP_ELSE new-line group?
    ;
    
    endif-line:
        PP_ENDIF new-line
    ;
    
    control-line:
        PP_INCLUDE pp-tokens new-line
    |   PP_DEFINE identifier LPAREN RPAREN replacement-list new-line
    |   PP_DEFINE identifier LPAREN identifier-list RPAREN replacement-list new-line
    |   PP_DEFINE identifier LPAREN DOT DOT DOT RPAREN replacement-list new-line
    |   PP_DEFINE identifier LPAREN identifier-list COMMA DOT DOT DOT RPAREN replacement-list new-line
    |   PP_DEFINE identifier replacement-list new-line
    |   PP_UNDEF identifier new-line
    |   PP_LINE pp-tokens new-line
    |   PP_ERROR pp-tokens? new-line
    |   PP_PRAGMA pp-tokens? new-line
    |   SHARP new-line
    ;
    
    text-line:
        pp-tokens? new-line
    ;
    
    non-directive-line :
        SHARP non-directive
    ;
    
    non-directive:
        pp-tokens new-line
    ;
    
    replacement-list:
        pp-tokens?
    ;
    
    pp-tokens:
        preprocessing-token
    |   pp-tokens preprocessing-token
    ;
    
    new-line:
        LineTerminator
    ;
    




© 2015 - 2025 Weber Informatics LLC | Privacy Policy