A.13 Grammar

Computer Education, Training & Tutorial Resources - ComputerEducationWorld.com
Home » Free Educations » Free Programming Training » C Programming »

Below is a recapitulation of the grammar that was given throughout the earlier part of this appendix. It has exactly the same content, but is in different order.
The grammar has undefined terminal symbols integer-constant, character-constant, floating-constant, identifier, string, and enumeration-constant; the typewriter style words and symbols are terminals given literally. This grammar can be transformed mechanically into input acceptable for an automatic parser-generator. Besides adding whatever syntactic marking is used to indicate alternatives in productions, it is necessary to expand the “one of” constructions, and (depending on the rules of the parser-generator) to duplicate each production with an opt symbol, once with the symbol and once without. With one further change, namely deleting the production typedef-name: identifier and making typedef-name a terminal symbol, this grammar is acceptable to the YACC parser-generator. It has only one conflict, generated by the if-else ambiguity.
    translation-unit:
      external-declaration
      translation-unit external-declaration
    external-declaration:
      function-definition
      declaration
    function-definition:
      declaration-specifiersopt declarator declaration-listopt compound-statement
    declaration:
      declaration-specifiers init-declarator-listopt;
    declaration-list:
      declaration
      declaration-list declaration
    declaration-specifiers:
      storage-class-specifier declaration-specifiersopt
      type-specifier declaration-specifiersopt
      type-qualifier declaration-specifiersopt
    storage-class specifier: one of
      auto register static extern typedef
    type specifier: one of
      void char short int long float double signed
      unsigned struct-or-union-specifier enum-specifier typedef-name
    type-qualifier: one of
      const volatile
    struct-or-union-specifier:
      struct-or-union identifieropt { struct-declaration-list }
      struct-or-union identifier
    struct-or-union: one of
      struct union
    struct-declaration-list:
      struct declaration
      struct-declaration-list struct declaration
    init-declarator-list:
      init-declarator
      init-declarator-list, init-declarator
    init-declarator:
      declarator
      declarator = initializer
    struct-declaration:
      specifier-qualifier-list struct-declarator-list;
    specifier-qualifier-list:
      type-specifier specifier-qualifier-listopt
      type-qualifier specifier-qualifier-listopt
    struct-declarator-list:
      struct-declarator
      struct-declarator-list , struct-declarator
    struct-declarator:
      declarator
      declaratoropt : constant-expression
    enum-specifier:
      enum identifieropt { enumerator-list }
      enum identifier
    enumerator-list:
      enumerator
      enumerator-list , enumerator
    enumerator:
      identifier
      identifier = constant-expression
    declarator:
      pointeropt direct-declarator
    direct-declarator:
      identifier
      (declarator)
      direct-declarator [ constant-expressionopt ]
      direct-declarator ( parameter-type-list )
      direct-declarator ( identifier-listopt )
    pointer:
      * type-qualifier-listopt
      * type-qualifier-listopt pointer
    type-qualifier-list:
      type-qualifier
      type-qualifier-list type-qualifier
    parameter-type-list:
      parameter-list
      parameter-list , …
    parameter-list:
      parameter-declaration
      parameter-list , parameter-declaration
    parameter-declaration:
      declaration-specifiers declarator
      declaration-specifiers abstract-declaratoropt
    identifier-list:
      identifier
      identifier-list , identifier
    initializer:
      assignment-expression
      { initializer-list }
      { initializer-list , }
    initializer-list:
      initializer
      initializer-list , initializer
    type-name:
      specifier-qualifier-list abstract-declaratoropt
    abstract-declarator:
      pointer
      pointeropt direct-abstract-declarator
    direct-abstract-declarator:
      ( abstract-declarator )
      direct-abstract-declaratoropt [constant-expressionopt]
      direct-abstract-declaratoropt (parameter-type-listopt)
    typedef-name:
      identifier
    statement:
      labeled-statement
      expression-statement
      compound-statement
      selection-statement
      iteration-statement
      jump-statement
    labeled-statement:
      identifier : statement
      case constant-expression : statement
      default : statement
    expression-statement:
      expressionopt;
    compound-statement:
      { declaration-listopt statement-listopt }
    statement-list:
      statement
      statement-list statement
    selection-statement:
      if (expression) statement
      if (expression) statement else statement
      switch (expression) statement
    iteration-statement:
      while (expression) statement
      do statement while (expression);
      for (expressionopt; expressionopt; expressionopt) statement
    jump-statement:
      goto identifier;
      continue;
      break;
      return expressionopt;
    expression:
      assignment-expression
      expression , assignment-expression
    assignment-expression:
      conditional-expression
      unary-expression assignment-operator assignment-expression
    assignment-operator: one of
      = *= /= %= += -= <<= >>= &= ^= |=
    conditional-expression:
      logical-OR-expression
      logical-OR-expression ? expression : conditional-expression
    constant-expression:
      conditional-expression
    logical-OR-expression:
      logical-AND-expression
      logical-OR-expression || logical-AND-expression
    logical-AND-expression:
      inclusive-OR-expression
      logical-AND-expression && inclusive-OR-expression
    inclusive-OR-expression:
      exclusive-OR-expression
      inclusive-OR-expression | exclusive-OR-expression
    exclusive-OR-expression:
      AND-expression
      exclusive-OR-expression ^ AND-expression
    AND-expression:
      equality-expression
      AND-expression & equality-expression
    equality-expression:
      relational-expression
      equality-expression == relational-expression
      equality-expression != relational-expression
    relational-expression:
      shift-expression
      relational-expression < shift-expression
      relational-expression > shift-expression
      relational-expression <= shift-expression
      relational-expression >= shift-expression
    shift-expression:
      additive-expression
      shift-expression << additive-expression
      shift-expression >> additive-expression
    additive-expression:
      multiplicative-expression
      additive-expression + multiplicative-expression
      additive-expression - multiplicative-expression
    multiplicative-expression:
      multiplicative-expression * cast-expression
      multiplicative-expression / cast-expression
      multiplicative-expression % cast-expression
    cast-expression:
      unary expression
      (type-name) cast-expression
    unary-expression:
      postfix expression
      ++unary expression
      –unary expression
      unary-operator cast-expression
      sizeof unary-expression
      sizeof (type-name)
    unary operator: one of
      & * + - ~ !
    postfix-expression:
      primary-expression
      postfix-expression[expression]
      postfix-expression(argument-expression-listopt)
      postfix-expression.identifier
      postfix-expression->+identifier
      postfix-expression++
      postfix-expression–
    primary-expression:
      identifier
      constant
      string
      (expression)
    argument-expression-list:
      assignment-expression
      assignment-expression-list , assignment-expression
    constant:
      integer-constant
      character-constant
      floating-constant
      enumeration-constant
The following grammar for the preprocessor summarizes the structure of control lines, but is not suitable for mechanized parsing. It includes the symbol text, which means ordinary program text, non-conditional preprocessor control lines, or complete preprocessor conditional instructions.
    control-line:
      # define identifier token-sequence
      # define identifier(identifier, … , identifier) token-sequence
      # undef identifier
      # include <filename>
      # include “filename”
      # line constant “filename”
      # line constant
      # error token-sequenceopt
      # pragma token-sequenceopt
      #
      preprocessor-conditional
    preprocessor-conditional:
      if-line text elif-parts else-partopt #endif
    if-line:
      # if constant-expression
      # ifdef identifier
      # ifndef identifier
    elif-parts:
      elif-line text
      elif-partsopt
    elif-line:
      # elif constant-expression
    else-part:
      else-line text
    else-line:
      #else


• • •
 



captcha PHP Script Free PHP captcha script free php
Website Design by WebWalas.com