Ignore:
Timestamp:
Apr 5, 2019, 9:26:53 PM (5 years ago)
Author:
coas-nagasima
Message:

mbed関連を更新
シリアルドライバをmbedのHALを使うよう変更
ファイルディスクリプタの処理を更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • asp3_tinet_ecnl_rx/trunk/asp3_dcre/tecsgen/tecslib/core/C_parser.y.rb

    r359 r374  
    44#      Generator for TOPPERS Embedded Component System
    55
    6 #   Copyright (C) 2008-2014 by TOPPERS Project
     6#   Copyright (C) 2008-2018 by TOPPERS Project
    77#--
    8 #   上記著作権者は,以下の(1)(4)の条件を満たす場合に限り,本ソフトウェ
     8#   上記著作権者は,以下の(1)(4)の条件を満たす場合に限り,本ソフトウェ
    99#   ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
    1010#   変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     
    4848# argument_expression_list(関数引数), assignment_expression(代入)がない
    4949# 式の result は、すべて配列で第一要素が識別シンボル、第二要素以下が引数
     50#
     51# 2019/3/28 長島 下記のC99の構文に近づくよう変更
     52#(読めないヘッダーファイルがあったため)
     53# http://www.quut.com/c/ANSI-C-grammar-y-1999.html
     54# 元々のコメントと合わなくなっています
    5055
    5156primary_expression
    52         : namespace_identifier
     57                : namespace_identifier
    5358                { result = [ :IDENTIFIER, val[0] ] }     #1ok
    5459#        : IDENTIFIER   # mikan namespace への対応
     
    5863#        | FALSE
    5964#               { result = [ :BOOL_CONSTANT, false ] }
    60         | INTEGER_CONSTANT
     65                | INTEGER_CONSTANT
    6166                { result = [ :INTEGER_CONSTANT, val[0] ] }
    62         | FLOATING_CONSTANT
     67                | FLOATING_CONSTANT
    6368                { result = [ :FLOATING_CONSTANT, val[0] ] }
    64         | OCTAL_CONSTANT
     69                | OCTAL_CONSTANT
    6570                { result = [ :OCTAL_CONSTANT, val[0] ] }
    66         | HEX_CONSTANT
     71                | HEX_CONSTANT
    6772                { result = [ :HEX_CONSTANT, val[0] ] }
    68         | CHARACTER_LITERAL
     73                | CHARACTER_LITERAL
    6974                { result = [ :CHARACTER_LITERAL, val[0] ] }
    70         | string_literal_list
     75                | string_literal_list
    7176                { result = [ :STRING_LITERAL_LIST, val[0] ] }
    72         | '(' expression ')'
     77                | '(' expression ')'
    7378                { result = [ :PARENTHESES, val[1].get_elements ] }
    7479
    7580string_literal_list
    76         : STRING_LITERAL
     81                : STRING_LITERAL
    7782                { result = [val[0]] }
    78         | string_literal_list STRING_LITERAL
     83                | string_literal_list STRING_LITERAL
    7984                { result << val[1] }
    8085
    8186# 関数呼び出しと後置インクリメント、デクリメント演算子がない
    8287postfix_expression
    83         : primary_expression
    84         | primary_expression '(' argument_list ')'
    85         | primary_expression type_qualifier '(' argument_list ')'    # intended __asm volatile ( "   MNEMONIC  OPERAND" );
    86         | postfix_expression '[' expression ']'
     88                : primary_expression
     89                | postfix_expression '[' expression ']'
    8790                { result = [ :OP_SUBSC, val[0], val[2] ] }
    88         | postfix_expression '.' IDENTIFIER
     91                | postfix_expression '(' ')'
     92                | postfix_expression '(' argument_expression_list ')'
     93                | postfix_expression type_qualifier '(' argument_expression_list ')'    # intended __asm volatile ( "   MNEMONIC  OPERAND" );
     94                | postfix_expression '.' IDENTIFIER
    8995                { result = [ :OP_DOT, val[0], val[2] ] }
    90         | postfix_expression '->' IDENTIFIER
     96                | postfix_expression '->' IDENTIFIER
    9197                { result = [ :OP_REF, val[0], val[2] ] }
    92         | postfix_expression '++'       { result = val[0] }   # ++, -- は無視する
    93         | postfix_expression '--'       { result = val[0] }
    94 
    95 argument_list
    96         :
    97         | expression
    98         | argument_list ',' expression
     98                | postfix_expression '++'       { result = val[0] }   # ++, -- は無視する
     99                | postfix_expression '--'       { result = val[0] }
     100                | '(' type_name ')' '{' initializer_list '}'
     101                | '(' type_name ')' '{' initializer_list ',' '}'
     102
     103argument_expression_list
     104                : assignment_expression
     105                | argument_expression_list ',' assignment_expression
    99106
    100107
    101108# 前置インクリメント、デクリメント演算子がない
    102109unary_expression
    103         : postfix_expression
    104         | unary_operator cast_expression
     110                : postfix_expression
     111                | unary_operator cast_expression
    105112                { result = [ val[0], val[1] ] }
    106         | SIZEOF unary_expression
     113                | SIZEOF unary_expression
    107114                { result = [ :OP_SIZEOF_EXPR, val[1] ] }
    108         | SIZEOF '(' type_name ')'
     115                | SIZEOF '(' type_name ')'
    109116                { result = [ :OP_SIZEOF_TYPE, val[1] ] }
    110117                | '++' unary_expression                 { result = val[1] }   # ++, -- は無視する
     
    112119
    113120unary_operator
    114         : '&'   { result = :OP_U_AMP }
    115         | '*'   { result = :OP_U_ASTER }
    116         | '+'   { result = :OP_U_PLUS }
    117         | '-'   { result = :OP_U_MINUS }
    118         | '~'   { result = :OP_U_TILDE }
    119         | '!'   { result = :OP_U_EXCLAM }
     121                : '&'   { result = :OP_U_AMP }
     122                | '*'   { result = :OP_U_ASTER }
     123                | '+'   { result = :OP_U_PLUS }
     124                | '-'   { result = :OP_U_MINUS }
     125                | '~'   { result = :OP_U_TILDE }
     126                | '!'   { result = :OP_U_EXCLAM }
    120127
    121128cast_expression
    122         : unary_expression
    123         | '(' type_name ')' cast_expression
     129                : unary_expression
     130                | '(' type_name ')' cast_expression
    124131                {  result = [ :CAST, val[1], val[3] ] }
    125132
    126133multiplicative_expression
    127         : cast_expression
    128         | multiplicative_expression '*' cast_expression
     134                : cast_expression
     135                | multiplicative_expression '*' cast_expression
    129136                { result = [ :OP_MULT, val[0], val[2] ]  }
    130         | multiplicative_expression '/' cast_expression
     137                | multiplicative_expression '/' cast_expression
    131138                { result = [ :OP_DIV, val[0], val[2] ]  }
    132         | multiplicative_expression '%' cast_expression
     139                | multiplicative_expression '%' cast_expression
    133140                { result = [ :OP_REMAIN, val[0], val[2] ]  }
    134141
    135142additive_expression
    136         : multiplicative_expression
    137         | additive_expression '+' multiplicative_expression
     143                : multiplicative_expression
     144                | additive_expression '+' multiplicative_expression
    138145                { result = [ :OP_ADD, val[0], val[2] ]  }
    139         | additive_expression '-' multiplicative_expression
     146                | additive_expression '-' multiplicative_expression
    140147                { result = [ :OP_SUB, val[0], val[2] ]  }
    141148
    142149shift_expression
    143         : additive_expression
    144         | shift_expression '<<' additive_expression
     150                : additive_expression
     151                | shift_expression '<<' additive_expression
    145152                { result = [ :OP_LSFT, val[0], val[2] ]  }
    146         | shift_expression '>>' additive_expression
     153                | shift_expression '>>' additive_expression
    147154                { result = [ :OP_RSFT, val[0], val[2] ]  }
    148155
    149156relational_expression
    150         : shift_expression
    151         | relational_expression '<' shift_expression
     157                : shift_expression
     158                | relational_expression '<' shift_expression
    152159                { result = [ :OP_LT, val[0], val[2] ]  }
    153         | relational_expression '>' shift_expression
     160                | relational_expression '>' shift_expression
    154161                { result = [ :OP_GT, val[0], val[2] ]  }
    155         | relational_expression '<=' shift_expression
     162                | relational_expression '<=' shift_expression
    156163                { result = [ :OP_LE, val[0], val[2] ]  }
    157         | relational_expression '>=' shift_expression
     164                | relational_expression '>=' shift_expression
    158165                { result = [ :OP_GE, val[0], val[2] ]  }
    159166
    160167equality_expression
    161         : relational_expression
    162         | equality_expression '==' relational_expression
     168                : relational_expression
     169                | equality_expression '==' relational_expression
    163170                { result = [ :OP_EQ, val[0], val[2] ]  }
    164         | equality_expression '!=' relational_expression
     171                | equality_expression '!=' relational_expression
    165172                { result = [ :OP_NE, val[0], val[2] ]  }
    166173
    167174and_expression
    168         : equality_expression
    169         | and_expression '&' equality_expression
     175                : equality_expression
     176                | and_expression '&' equality_expression
    170177                { result = [ :OP_AND, val[0], val[2] ]  }
    171178
    172179exclusive_or_expression
    173         : and_expression
    174         | exclusive_or_expression '^' and_expression
     180                : and_expression
     181                | exclusive_or_expression '^' and_expression
    175182                { result = [ :OP_EOR, val[0], val[2] ]  }
    176183
    177184inclusive_or_expression
    178         : exclusive_or_expression
    179         | inclusive_or_expression '|' exclusive_or_expression
     185                : exclusive_or_expression
     186                | inclusive_or_expression '|' exclusive_or_expression
    180187                { result = [ :OP_OR, val[0], val[2] ]  }
    181188
    182189logical_and_expression
    183         : inclusive_or_expression
    184         | logical_and_expression '&&' inclusive_or_expression
     190                : inclusive_or_expression
     191                | logical_and_expression '&&' inclusive_or_expression
    185192                { result = [ :OP_LAND, val[0], val[2] ]  }
    186193
    187194logical_or_expression
    188         : logical_and_expression
    189         | logical_or_expression '||' logical_and_expression
     195                : logical_and_expression
     196                | logical_or_expression '||' logical_and_expression
    190197                { result = [ :OP_LOR, val[0], val[2] ]  }
    191198
    192199conditional_expression
    193         : logical_or_expression
    194         | logical_or_expression '?' expression ':' conditional_expression
     200                : logical_or_expression
     201                | logical_or_expression '?' expression ':' conditional_expression
    195202                { result = [ :OP_CEX, val[0], val[2].get_elements, val[4] ]  }
    196203
    197 
    198 # コンマ演算子が使えない
     204assignment_expression
     205                : conditional_expression
     206                | unary_expression assignment_operator assignment_expression
     207
     208assignment_operator
     209                : '='
     210                | '+='
     211                | '-='
     212                | '*='
     213                | '/='
     214                | '%='
     215                | '<<='
     216                | '>>='
     217                | '&='
     218                | '|='
     219                | '^='
     220
    199221expression
    200         : conditional_expression
     222                : assignment_expression
    201223                {
    202224                        result = Expression.new( val[0] )
    203225                        # result.print
    204226                }
     227                | expression ',' assignment_expression
     228                {
     229                        result = Expression.new( val[2] )    # ',' の後ろを採用
     230                }
    205231
    206232constant_expression
    207         : conditional_expression
     233                : conditional_expression
    208234                {
    209235                        result = Expression.new( val[0] )
     
    218244                }
    219245
    220 
    221 
    222246# Types
    223247##########################  宣言  ##########################
     
    227251# K&Rとの違い: storage classが指定できない、型が省略できない
    228252declaration
    229         : declaration_specifiers init_declarator_list ';'
    230 #        : type_specifier_qualifier_list init_declarator_list ';'
     253                : declaration_specifiers init_declarator_list ';'
     254#        : specifier_qualifier_list init_declarator_list ';'
    231255
    232256# declaration_specifiersは関数のパラメータで使われるが、
    233 # type_specifier_qualifier_listで十分かもしれない
     257# specifier_qualifier_listで十分かもしれない
    234258
    235259declaration_specifiers
    236         : storage_class
     260                : storage_class_specifier
    237261                {
    238262                        result = CIntType.new( -3 )    # storage class は無視
    239263                }
    240         | type_specifier
    241         | type_qualifier
     264                | storage_class_specifier declaration_specifiers
     265                {
     266                        result = val[1]                # storage class は無視
     267                }
     268                | type_specifier
     269                | type_specifier declaration_specifiers
     270                {
     271                        result = val[1].merge val[0]
     272                }
     273                | type_qualifier
    242274                {
    243275                        result = CIntType.new( -3 )
    244276                        result.set_qualifier val[0]
    245277                }
    246         | storage_class declaration_specifiers
    247                 {
    248                         result = val[1]                # storage class は無視
    249                 }
    250         | type_specifier declaration_specifiers
    251                 {
    252                         result = val[1].merge val[0]
    253                 }
    254         | type_qualifier declaration_specifiers
     278                | type_qualifier declaration_specifiers
    255279                {
    256280                        val[1].set_qualifier val[0]
    257                         result = val[1]
    258                 }
    259 
     281                                                result = val[1]
     282                }
     283                | function_specifier
     284                | function_specifier declaration_specifiers
    260285
    261286init_declarator_list
    262         : init_declarator
     287                : init_declarator
    263288                { result = [val[0]] }
    264         | init_declarator_list ',' init_declarator
     289                | init_declarator_list ',' init_declarator
    265290                { result << val[2] }
    266291
    267292init_declarator
    268         : declarator
    269         | declarator '=' initializer
     293                : declarator
     294                | declarator '=' initializer
    270295                { val[0].set_initializer( val[2] ) }
    271296
     297storage_class_specifier
     298                : EXTERN
     299                | STATIC
     300                | AUTO
     301                | REGISTER
     302
    272303type_specifier
    273         : VOID  { set_no_type_name true; result = CVoidType.new }
    274         | FLOAT { set_no_type_name true; result = CFloatType.new(-32) }
    275         | DOUBLE        { set_no_type_name true; result = CFloatType.new(-64) }
    276         | BOOL  { set_no_type_name true; result = CBoolType.new }
    277         | struct_specifier      { set_no_type_name true; result = val[0] } # set_no_type_name true は struct_tag でも呼ばれる
    278         | union_specifier       { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
    279         | enum_specifier        { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
    280         | TYPE_NAME     { set_no_type_name true; result = CDefinedType.new( val[0].val ) }
    281 
    282         | CHAR  { set_no_type_name true; result = CIntType.new(-11 ) }
    283         | SHORT { set_no_type_name true; result = CIntType.new( -2 ) }
    284         | INT           { set_no_type_name true; result = CIntType.new( -3 ) }
    285         | LONG  { set_no_type_name true; result = CIntType.new( -4 ) }
    286         | SIGNED
     304                : VOID
     305                { set_no_type_name true; result = CVoidType.new }
     306                | CHAR
     307                { set_no_type_name true; result = CIntType.new(-11 ) }
     308                | SHORT
     309                { set_no_type_name true; result = CIntType.new( -2 ) }
     310                | INT
     311                { set_no_type_name true; result = CIntType.new( -3 ) }
     312                | LONG
     313                { set_no_type_name true; result = CIntType.new( -4 ) }
     314                | FLOAT
     315                { set_no_type_name true; result = CFloatType.new(-32) }
     316                | DOUBLE
     317                { set_no_type_name true; result = CFloatType.new(-64) }
     318                | SIGNED
    287319                {
    288320                        set_no_type_name true
     
    290322                        result.set_sign :SIGNED
    291323                }
    292         | UNSIGNED
     324                | UNSIGNED
    293325                {
    294326                        set_no_type_name true
     
    296328                        result.set_sign :UNSIGNED
    297329                }
     330                | BOOL
     331                { set_no_type_name true; result = CBoolType.new }
     332                | struct_specifier
     333                { set_no_type_name true; result = val[0] } # set_no_type_name true は struct_tag でも呼ばれる
     334                | union_specifier
     335                { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
     336                | enum_specifier
     337                { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
     338                | TYPE_NAME
     339                { set_no_type_name true; result = CDefinedType.new( val[0].val ) }
    298340
    299341# mikan K&Rのstruct_or_union_specifierに相当するが、unionは使えない, bit field にも対応しない
    300342struct_specifier                # mikan
    301343#        : STRUCT struct_tag '{'
    302         : struct_term struct_tag '{'
     344                : struct_term struct_tag '{'
    303345                { StructType.set_define( true )  }
    304            struct_declaration_list '}'
     346                struct_declaration_list '}'
    305347                {
    306348                        StructType.end_of_parse
     
    308350                }
    309351#        | STRUCT
    310         | struct_term
     352                | struct_term
    311353                {
    312354                        result = CStructType.new()
    313355                        StructType.set_define( true )
    314356                }
    315            '{' struct_declaration_list '}'
     357                '{' struct_declaration_list '}'
    316358                {
    317359                        StructType.end_of_parse
     
    319361                }
    320362#        | STRUCT struct_tag   # mikan struct_tag は namespace 対応が必要
    321         | struct_term struct_tag   # mikan struct_tag は namespace 対応が必要
     363                | struct_term struct_tag   # mikan struct_tag は namespace 対応が必要
    322364                {
    323365                        StructType.set_define( false )
     
    327369
    328370struct_term
    329         : STRUCT { set_no_type_name true }
     371                : STRUCT { set_no_type_name true }
    330372
    331373struct_declaration_list
    332         : struct_declaration
    333         | struct_declaration_list struct_declaration
     374                : struct_declaration
     375                | struct_declaration_list struct_declaration
    334376
    335377struct_tag:
    336         IDENTIFIER
     378                IDENTIFIER
    337379                {
    338380                        result = CStructType.new( val[0].val )
     
    342384# ポインタ修飾子を追加
    343385struct_declaration
    344         : declaration_specifiers struct_declarator_list ';'
    345 #        :                                type_specifier_qualifier_list struct_declarator_list ';'
     386                : declaration_specifiers struct_declarator_list ';'
     387#        :                                specifier_qualifier_list struct_declarator_list ';'
    346388                {
    347389                        val[1].each { |i|       # i: Decl
     
    353395                        result = val[1]
    354396                }
    355         | union_specifier ';'                       # 無名
    356         | struct_specifier ';'                       # 無名
     397                # ビットフィールドを読み飛ばし
     398                | declaration_specifiers struct_declarator_list ':' constant_expression ';'
     399                {
     400                        val[1].each { |i|       # i: Decl
     401                                i.set_type( val[0] )
     402                                i.set_kind( :MEMBER )
     403                                i.check
     404                                CStructType.new_member( i )
     405                        }
     406                        result = val[1]
     407                }
     408                | union_specifier ';'                       # 無名
     409                | struct_specifier ';'                       # 無名
    357410
    358411
     
    360413# K&Rのspecifier_qualifier_listと同じ
    361414# 名前がまぎらわしかったのでtype_を付けた
    362 type_specifier_qualifier_list
    363         : type_specifier
    364         | type_specifier type_specifier_qualifier_list
     415specifier_qualifier_list
     416                : type_specifier specifier_qualifier_list
    365417                {
    366418                        result = val[1].merge val[0]
    367419                }
    368         | type_qualifier
     420                | type_specifier
     421                | type_qualifier specifier_qualifier_list
     422                {
     423                        val[1].set_qualifier val[0]
     424                                                result = val[1]
     425                }
     426                | type_qualifier
    369427                {
    370428                        result = CIntType.new( -3 )
    371429                        result.set_qualifier val[0]
    372430                }
    373         | type_qualifier type_specifier_qualifier_list
    374                 {
    375                         val[1].set_qualifier val[0]
    376                         result = val[1]
    377                 }
    378431
    379432struct_declarator_list
    380         : struct_declarator
     433                : struct_declarator
    381434                { result = [ val[0] ] }
    382         | struct_declarator_list ',' struct_declarator
     435                | struct_declarator_list ',' struct_declarator
    383436                { result << val[2] }
    384437
    385438# ビットフィールドは使えない
    386439struct_declarator
    387         : declarator
    388 
    389 
     440                : declarator
     441#               | ':' constant_expression
     442#               | declarator ':' constant_expression
    390443
    391444union_specifier
     
    393446#        | UNION '{' union_declaration_list '}'
    394447#        | UNION union_tag   # mikan struct_tag は namespace 対応が必要
    395         : union_term union_tag '{' union_declaration_list '}'
    396         | union_term '{' union_declaration_list '}'
    397         | union_term union_tag   # mikan struct_tag は namespace 対応が必要
     448                : union_term union_tag '{' union_declaration_list '}'
     449                | union_term '{' union_declaration_list '}'
     450                | union_term union_tag   # mikan struct_tag は namespace 対応が必要
    398451
    399452union_term
    400         : UNION { set_no_type_name true }
     453                : UNION { set_no_type_name true }
    401454
    402455union_declaration_list
    403         : union_declaration
    404         | union_declaration_list union_declaration
     456                : union_declaration
     457                | union_declaration_list union_declaration
    405458
    406459union_tag:
     
    408461
    409462union_declaration
    410         : declaration_specifiers union_declarator_list ';'
     463                : declaration_specifiers union_declarator_list ';'
    411464                | union_specifier ';'                       # 無名
    412465                | struct_specifier ';'                      # 無名
    413466
    414467union_declarator_list
    415         : union_declarator
    416         | union_declarator_list ',' union_declarator
    417 
    418 # ビットフィールドは使えない
     468                : union_declarator
     469                | union_declarator_list ',' union_declarator
     470
    419471union_declarator
    420         : declarator
    421 
    422 
    423 
    424 # enumの種類を追加
    425 enum_specifier          # mikan
    426         : enum_type            '{' enumerator_list '}'
    427         | enum_type IDENTIFIER '{' enumerator_list '}'
    428         | enum_type IDENTIFIER
    429 
    430 enum_type
    431         : ENUM  { result = CEnumType.new( -1 ) }
    432 #        | ENUM8        { result = CEnumType.new( 8 ) }
    433 #        | ENUM16       { result = CEnumType.new( 16 ) }
    434 #        | ENUM32       { result = CEnumType.new( 32 ) }
    435 #        | ENUM64       { result = CEnumType.new( 64 ) }
    436 #        | ENUM128      { result = CEnumType.new( 128 ) }
     472                : declarator
     473                | ':' constant_expression
     474                | declarator ':' constant_expression
     475
     476enum_specifier
     477                : ENUM '{' enumerator_list '}'
     478                | ENUM IDENTIFIER '{' enumerator_list '}'
     479                | ENUM '{' enumerator_list ',' '}'
     480                | ENUM IDENTIFIER '{' enumerator_list ',' '}'
     481                | ENUM IDENTIFIER
     482                | ENUM TYPE_NAME '{' enumerator_list '}'
     483                | ENUM TYPE_NAME '{' enumerator_list ',' '}'
     484                | ENUM TYPE_NAME
    437485
    438486enumerator_list
    439         : enumerator
    440         | enumerator_list ',' enumerator
     487                : enumerator
     488                | enumerator_list ',' enumerator
    441489
    442490enumerator
    443         : IDENTIFIER
    444         | IDENTIFIER '=' constant_expression
     491                : IDENTIFIER
     492                | IDENTIFIER '=' constant_expression
    445493
    446494type_qualifier
    447         : CONST { result = :CONST }
    448         | VOLATILE      { result = :VOLATILE }
     495                : CONST
     496                { result = :CONST }
     497                | RESTRICT
     498                | VOLATILE
     499                { result = :VOLATILE }
     500
     501function_specifier
     502                : __INLINE__
     503                | INLINE
     504                | __INLINE
     505                | CINLINE
    449506
    450507declarator
    451         : pointer direct_declarator
     508                : pointer direct_declarator
    452509                {
    453510                        val[1].set_type( val[0] )
    454511                        result = val[1]
    455512                }
    456         | direct_declarator
    457         | pointer TYPE_NAME     # 関数ポインタの typedef が二重定義の場合
     513                | direct_declarator
     514                | pointer TYPE_NAME     # 関数ポインタの typedef が二重定義の場合
    458515                {
    459516                        result = Decl.new( val[1].val )
     
    462519
    463520direct_declarator               # mikan
    464         : IDENTIFIER
     521                : IDENTIFIER
    465522                { result = Decl.new( val[0].val ) }
    466         | '(' declarator ')'
     523                | '(' declarator ')'
    467524                { result = val[1] }
    468         | direct_declarator '[' constant_expression ']'
     525                | direct_declarator '[' constant_expression ']'
    469526                {
    470527                        val[0].set_type( CArrayType.new( val[2] ) )
    471528                        result = val[0]
    472529                }
    473         | direct_declarator '[' ']'
     530                | direct_declarator '[' ']'
    474531                {
    475532                        val[0].set_type( CArrayType.new )
    476533                        result = val[0]
    477534                }
    478         | direct_declarator '(' parameter_type_list ')'
     535                | direct_declarator '(' parameter_type_list ')'
    479536                {
    480537                #       Generator.warning( "W6001 need 'void' for no parameter"  )
     
    482539                        result = val[0]
    483540                }
    484 
    485 #        | direct_declarator '(' identifier_list ')'  # これは何のために必要? 060211
    486         | direct_declarator '(' ')'
     541                | direct_declarator '(' identifier_list ')'  # これは何のために必要? 060211
     542                | direct_declarator '(' ')'
    487543                {
    488544                #       Generator.warning( "W6002 need 'void' for no parameter"  )
     
    492548
    493549pointer
    494         : '*'
     550                : '*'
    495551                { result = CPtrType.new }
    496         | '*' type_qualifier
     552                | '*' type_qualifier_list
    497553                {
    498554                        result = CPtrType.new
    499555                        result.set_qualifier( val[1] )
    500556                }
    501         | '*' pointer
     557                | '*' pointer
    502558                {
    503559                        val[1].set_type(CPtrType.new)
    504560                        result = val[1]
    505561                }
    506         | '*' type_qualifier pointer
     562                | '*' type_qualifier_list pointer
    507563                {
    508564                        ptrtype = CPtrType.new
     
    512568                }
    513569
     570type_qualifier_list
     571                : type_qualifier
     572                | type_qualifier_list type_qualifier
    514573
    515574parameter_type_list
    516         : parameter_list
    517         | parameter_list ',' '.' '.' '.'
     575                : parameter_list
     576                | parameter_list ',' '.' '.' '.'
    518577                # mikan 可変長パラメータ,  ... の間のスペースが許される(手抜き)
    519578
    520579parameter_list
    521         : parameter_declaration
     580                : parameter_declaration
    522581#               { result = ParamList.new( val[0] ) }
    523         | parameter_list ',' parameter_declaration
     582                | parameter_list ',' parameter_declaration
    524583#               {
    525584#                       val[0].add_param( val[2] )
     
    530589# パラメータ修飾子を追加
    531590parameter_declaration
    532         : declaration_specifiers declarator
     591                : declaration_specifiers declarator
    533592#               {
    534593#                       decl = ParamDecl.new( val[1], val[0], [] )
     
    545604#                       result = nil
    546605#               }
    547         | declaration_specifiers abstract_declarator    # 仮引数なし
    548         | declaration_specifiers                                                # 仮引数なし
    549 
    550 
    551 #identifier_list       # 060211  不用になった
    552 #        : IDENTIFIER
    553 #        | identifier_list ',' IDENTIFIER
     606                | declaration_specifiers abstract_declarator    # 仮引数なし
     607                | declaration_specifiers                                                # 仮引数なし
     608
     609
     610identifier_list       # 060211  不用になった
     611        : IDENTIFIER
     612        | identifier_list ',' IDENTIFIER
    554613
    555614type_name
    556         : type_specifier_qualifier_list
    557         | type_specifier_qualifier_list abstract_declarator
     615                : specifier_qualifier_list
     616                | specifier_qualifier_list abstract_declarator
    558617
    559618abstract_declarator             # mikan
    560         : pointer
    561         | direct_abstract_declarator
    562         | pointer direct_abstract_declarator
     619                : pointer
     620                | direct_abstract_declarator
     621                | pointer direct_abstract_declarator
    563622
    564623direct_abstract_declarator
    565         : '(' abstract_declarator ')'
    566         | '[' ']'
    567         | '[' constant_expression ']'
    568         | direct_abstract_declarator '[' ']'
    569         | direct_abstract_declarator '[' constant_expression ']'
    570         | '(' ')'
     624                : '(' abstract_declarator ')'
     625                | '[' ']'
     626                | '[' assignment_expression ']'
     627                | direct_abstract_declarator '[' ']'
     628                | direct_abstract_declarator '[' assignment_expression ']'
     629                | '(' ')'
    571630                {
    572631                        Generator.warning( "W6003 need 'void' for no parameter"  )
    573632                }
    574         | '(' parameter_type_list ')'
    575         | direct_abstract_declarator '(' ')'
     633                | '(' parameter_type_list ')'
     634                | direct_abstract_declarator '(' ')'
    576635                {
    577636                        Generator.warning( "W6004 need 'void' for no parameter"  )
    578637                }
    579         | direct_abstract_declarator '(' parameter_type_list ')'
     638                | direct_abstract_declarator '(' parameter_type_list ')'
    580639
    581640# assignment_expressionをconstant_expressionに変更
    582641initializer                     # mikan
    583         : constant_expression
     642                : assignment_expression
    584643                { result = val[0] }
    585         | '{' initializer_list '}'
     644                | '{' initializer_list '}'
    586645                { result = val[1] }
    587         | '{' initializer_list ',' '}'
     646                | '{' initializer_list ',' '}'
    588647                { result = val[1] }
    589         | C_EXP '(' STRING_LITERAL ')'
     648                | C_EXP '(' STRING_LITERAL ')'
    590649                { result = C_EXP.new( val[2] ) }
    591650
    592651initializer_list
    593         : initializer
     652                : initializer
    594653                {
    595654                        result = [ val[0] ]
    596655                }
    597         | initializer_list ',' initializer
     656                | initializer_list ',' initializer
    598657                {
    599658                        val[0] << val[2]
     
    606665#トップレベルの構文規則
    607666C_parser
    608         :
    609         | C_parser extension_statement
     667                :
     668                | C_parser extension_statement
    610669
    611670extension_statement
    612         : statement
    613         | EXTENSION statement
    614 
    615 statement
    616         : typedef
    617         | func_def
    618         | enum_specifier ';'
    619         | struct_specifier ';'
    620         | declaration
    621         | ';'
    622         | error   # エラー回復ポイント
     671                : cdl_statement
     672                | EXTENSION cdl_statement
     673
     674cdl_statement
     675                : typedef
     676                | func_def
     677                | enum_specifier ';'
     678                | struct_specifier ';'
     679                | declaration
     680                | ';'
     681                | error   # エラー回復ポイント
    623682
    624683typedef
    625         : TYPEDEF type_specifier_qualifier_list declarator_list ';'
     684        : TYPEDEF specifier_qualifier_list declarator_list ';'
    626685                {
    627686                        val[2].each{ |i|
     
    633692
    634693declarator_list
    635         : declarator
     694                : declarator
    636695                { result = [ val[0] ] }
    637         | declarator_list ',' declarator
     696                | declarator_list ',' declarator
    638697                { result << val[2] }
    639698
    640699func_def
    641         : declaration_specifiers declarator compoundstatement
    642 
    643 infunc_statement_list
    644         :
    645         | infunc_statement_list infunc_statement
    646 
    647 infunc_statement
    648         : declaration
    649         | ifstatement
    650         | whilestatement
    651         | dowhilestatement
    652         | forstatement
    653         | switchstatement
    654         | labelstatement
    655         | compoundstatement
    656         | gotostatement
    657         | expressionstatement
    658         | ';'
     700                : declaration_specifiers declarator compound_statement
     701
     702statement
     703                : labeled_statement
     704                | compound_statement
     705                | expression_statement
     706                | ifstatement
     707                | whilestatement
     708                | dowhilestatement
     709                | forstatement
     710                | switchstatement
     711                | jump_statement
     712                | asm_statement
     713
     714labeled_statement
     715                : IDENTIFIER ':' statement
     716                | CASE constant_expression ':' statement
     717                | DEFAULT ':' statement
     718
     719compound_statement
     720                : '{' '}'
     721                | '{' block_item_list '}'
     722
     723block_item_list
     724                : block_item
     725                | block_item_list block_item
     726
     727block_item
     728                : declaration
     729                | statement
     730
     731expression_statement
     732                : ';'
     733                | expression ';'
    659734
    660735ifstatement
    661         : IF '(' expression ')' infunc_statement
    662         | IF '(' expression ')' infunc_statement ELSE infunc_statement
     736                : IF '(' expression ')' statement
     737                | IF '(' expression ')' statement ELSE statement
     738
     739switchstatement
     740                : SWITCH '(' expression ')' compound_statement
    663741
    664742whilestatement
    665         : WHILE '(' expression ')' infunc_statement
     743                : WHILE '(' expression ')' statement
    666744
    667745dowhilestatement
    668         : DO infunc_statement WHILE '(' expression ')' ';'
     746                : DO statement WHILE '(' expression ')' ';'
    669747
    670748forstatement
    671         : FOR '(' expression ';' expression ';' expression ')' infunc_statement
    672 
    673 switchstatement
    674         : SWITCH '(' expression ')'  infunc_statment
    675 
    676 labelstatement
    677         : IDENTIFIER ':' infunc_statement
    678         | CASE constant_expression ':' infunc_statement
    679         | DEFAULT ':' infunc_statement
    680 
    681 compoundstatement
    682         : '{' infunc_statement_list '}'
    683 
    684 gotostatement
    685         : GOTO IDENTIFIER ';'
    686         | CONTINUE ';'
    687         | BREAK ';'
    688         | RETURN expression ';'
    689         | RETURN ';'
    690 
    691 expressionstatement
    692         : expression ';'
    693         | unary_expression assignment_operator expression ';'
    694 
    695 assignment_operator
    696         : '='
    697         | '+='
    698         | '-='
    699         | '*='
    700         | '/='
    701         | '%='
    702         | '<<='
    703         | '>>='
    704         | '&='
    705         | '|='
    706         | '^='
    707 
    708 storage_class
    709         : __INLINE__
    710         | INLINE
    711         | __INLINE
    712         | CINLINE
    713         | EXTERN
    714         | STATIC
    715         | AUTO
    716         | REGISTER
     749                : FOR '(' expression_statement expression_statement ')' statement
     750                | FOR '(' expression_statement expression_statement expression ')' statement
     751                | FOR '(' declaration expression_statement ')' statement
     752                | FOR '(' declaration expression_statement expression ')' statement
     753
     754jump_statement
     755                : GOTO IDENTIFIER ';'
     756                | CONTINUE ';'
     757                | BREAK ';'
     758                | RETURN ';'
     759                | RETURN expression ';'
    717760
    718761namespace_identifier
    719         : IDENTIFIER            { result = NamespacePath.new( val[0].val, false ) }
    720         | '::' IDENTIFIER       { result = NamespacePath.new( val[1].val, true ) }
    721         | namespace_identifier '::' IDENTIFIER
     762                : IDENTIFIER            { result = NamespacePath.new( val[0].val, false ) }
     763                | '::' IDENTIFIER       { result = NamespacePath.new( val[1].val, true ) }
     764                | namespace_identifier '::' IDENTIFIER
    722765                { result = val[0].append!( val[2].val ) }
    723766
     767asm_statement
     768                : _ASM {
     769                while true
     770                        # ';' が表れるまで、トークンを読み飛ばす。
     771                        # gcc の構文拡張に対応すべきだが、単純な実装として、';' まで読み飛ばす。
     772                        # トークン単位で読み飛ばしているので、文字列やコメント内の ';' は対象にならない。
     773                        token = next_token
     774                        if token[1].val == ";"
     775                                break
     776                        end
     777                        # p "skip: #{token[1].val}"
     778                end
     779                }
     780
    724781end
    725782
    726783---- inner
    727784
    728   RESERVED = {
    729     # keyword
    730     'typedef' => :TYPEDEF,
    731     'struct' => :STRUCT,
    732     'union' => :UNION,
    733     'sizeof' => :SIZEOF,
    734     'throw' => :THROW,
    735 
    736     # specifier
    737     # types
    738     'void'    => :VOID,
    739     'char'    => :CHAR,
    740     'short'   => :SHORT,
    741 
    742     'volatile'=> :VOLATILE,
    743     'const'   => :CONST,
    744     'extern'   => :EXTERN,
    745 
    746     'long'    => :LONG,
    747     'float'   => :FLOAT,
    748     'double'  => :DOUBLE,
    749     'signed'  => :SIGNED,
    750     'unsigned'=> :UNSIGNED,
    751 
    752     'int'     => :INT,
    753     'enum'    => :ENUM,
    754 
    755     'if'      => :IF,
    756     'else'    => :ELSE,
    757     'while'   => :WHILE,
    758     'do'      => :DO,
    759     'for'     => :FOR,
    760     'case'    => :CASE,
    761     'default' => :DEFAULT,
    762     'goto'    => :GOTO,
    763     'continue' => :CONTINUE,
    764     'break'   => :BREAK,
    765     'return'  => :RETURN,
    766     '__inline__'  => :__INLINE__,
    767     'inline'  => :INLINE,
    768     '__inline'  => :__INLINE,
    769     'Inline'  => :CINLINE,        # inline starting with Capital letter
    770     'static'  => :STATIC,
    771     'register' => :REGISTER,
    772     'auto'    => :AUTO,
    773     '__extension__'    => :EXTENSION,
    774 
    775   }
    776 
    777   @@generator_nest = -1
    778   @@generator_stack = []
    779   @@current_locale = []
    780 
    781   def finalize
    782 
    783     # mikan Namespace.pop
    784     Celltype.pop
    785     Cell.pop
    786     CompositeCelltype.pop
    787     Region.pop
    788 
    789   end
    790 
    791   def set_plugin( plugin )
    792     @plugin = plugin
    793   end
    794 
    795   def self.get_plugin
    796     @@generator_stack[@@generator_nest].get_plugin
    797   end
    798 
    799   def get_plugin
    800     @plugin
    801   end
    802 
    803   def parse(files)
    804 
    805     # mikan Namespace.push
    806     Celltype.push
    807     Cell.push
    808     CompositeCelltype.push
    809     Region.push
    810 
    811     @@generator_nest += 1
    812     @@generator_stack[@@generator_nest] = self
    813     @b_no_type_name = false
    814 
    815    begin
    816 
    817     @q = []
    818     comment = false
    819 
    820     # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
    821     TECS_LANG::set_kcode_binary
    822 
    823     # 800U, 0xffLL など (整数リテラルに共通の修飾子)
    824     integer_qualifier = "([Uu][Ll][Ll]|[Uu][Ll]|[Uu]|[Ll][Ll]|[Ll])?"
    825 
    826     files.each {|file|
    827       lineno = 1
    828      begin
    829 #2.0       IO.foreach(file) {|line|
    830        TECSIO.foreach(file) {|line|
    831         col = 1
    832         line.rstrip!
    833 
    834         until line.empty?
    835 
    836           if comment
    837             case line
    838             # コメント終了
    839             when /\A\*\//
    840               comment = false
    841             when /\A./
    842               ;
    843             end
    844           else
    845             case line
    846             # 空白、プリプロセスディレクティブ
    847             when /\A\s+/
    848               ;
    849             # 識別子
    850             when /\A[a-zA-Z_]\w*/
    851               word = $&
    852               @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)]
    853             # 16 進数定数
    854             when /\A0x[0-9A-Fa-f]+#{integer_qualifier}/
    855               @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)]
    856             # 8 進数定数
    857             when /\A0[0-7]+#{integer_qualifier}/
    858               @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)]
    859             # 浮動小数定数
    860             when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/
    861               @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
    862             # 整数定数
    863             when /\A\d+#{integer_qualifier}/
    864             # when /\A\d+/
    865               @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)]
    866             # 文字
    867             when /\A'(?:[^'\\]|\\.)'/
    868               @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)]
    869             # 文字列
    870 #              "#include  #include #include \"../systask/logtask.cfg\"       最後の " 忘れ)で無限ループ
    871 #            when /\A"(?:[^"\\]+|\\.)*"/
    872             when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
    873               @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)]
    874             # 行コメント
    875             when /\A\/\/.*$/
    876               # 読み飛ばすだけ
    877             # コメント開始
    878             when /\A\/\*/
    879               comment = true
    880             when /\A>>=/, /\A<<=/, /\A>>/,  /\A<</
    881               @q << [$&, Token.new($&, file, lineno, col)]
    882             when /\A\+=/, /\A\-=/, /\A\*=/, /\A\/=/, /\A%=/, /\A&=/, /\A\|=/, /\A\^=/
    883               @q << [$&, Token.new($&, file, lineno, col)]
    884             when /\A::/, /\A==/, /\A!=/, /\A>=/, /\A<=/, /\A\->/, /\A\+\+/, /\A\-\-/
    885               @q << [$&, Token.new($&, file, lineno, col)]
    886             when /\A./
    887               @q << [$&, Token.new($&, file, lineno, col)]
    888             else
    889               raise
    890             end
    891           end
    892 
    893           line = $'
    894           col += $&.length
    895         end
    896 
    897         lineno += 1
    898       }
    899 
    900      rescue => evar
    901        Generator.error( "B1002 while open or reading \'$1\'" , file )
    902        print_exception( evar )
    903      end
    904     }
    905 
    906     # 終了の印
    907     @q << nil
    908 
    909     @yydebug = true
    910     do_parse
    911 
    912    ensure
    913     @@generator_nest -= 1
    914     TECS_LANG::reset_kcode
    915    end
    916 
    917   end
    918 
    919 
    920   def next_token
    921     token = @q.shift
    922 
    923     if token then
    924       @@current_locale[@@generator_nest] = token[1].locale
    925 
    926       case token[1].val
    927       when ";", ":", ",", "(", ")", "{", "}"
    928         set_no_type_name false
    929       when ".", "->"
    930         set_no_type_name true
    931       end
    932 
    933       # TYPE_NAME トークンへ置き換え
    934       if @b_no_type_name == false
    935         if token[0] == :IDENTIFIER && Namespace.is_typename?( token[1].val ) then
    936           token[0] = :TYPE_NAME
    937           locale = @@current_locale[@@generator_nest]
     785        RESERVED = {
     786                # keyword
     787                'typedef' => :TYPEDEF,
     788                'struct' => :STRUCT,
     789                'union' => :UNION,
     790                'sizeof' => :SIZEOF,
     791                'throw' => :THROW,
     792
     793                # specifier
     794                # types
     795                'void'    => :VOID,
     796                'char'    => :CHAR,
     797                'short'   => :SHORT,
     798
     799                'volatile'=> :VOLATILE,
     800                'restrict'=> :RESTRICT,
     801                'const'   => :CONST,
     802                'extern'   => :EXTERN,
     803
     804                'long'    => :LONG,
     805                'float'   => :FLOAT,
     806                'double'  => :DOUBLE,
     807                'signed'  => :SIGNED,
     808                'unsigned'=> :UNSIGNED,
     809
     810                'int'     => :INT,
     811                'enum'    => :ENUM,
     812
     813                'if'      => :IF,
     814                'else'    => :ELSE,
     815                'while'   => :WHILE,
     816                'do'      => :DO,
     817                'for'     => :FOR,
     818                'switch'  => :SWITCH,
     819                'case'    => :CASE,
     820                'default' => :DEFAULT,
     821                'goto'    => :GOTO,
     822                'continue' => :CONTINUE,
     823                'break'   => :BREAK,
     824                'return'  => :RETURN,
     825                '__inline__'  => :__INLINE__,
     826                'inline'  => :INLINE,
     827                '__inline'  => :__INLINE,
     828                'Inline'  => :CINLINE,        # inline starting with Capital letter
     829                'static'  => :STATIC,
     830                'register' => :REGISTER,
     831                'auto'    => :AUTO,
     832                '__extension__'    => :EXTENSION,
     833                '__asm__' => :_ASM,
     834                'asm' =>     :_ASM
     835
     836        }
     837
     838        @@generator_nest = -1
     839        @@generator_stack = []
     840        @@current_locale = []
     841
     842        def finalize
     843
     844                # mikan Namespace.pop
     845                Celltype.pop
     846                Cell.pop
     847                CompositeCelltype.pop
     848                Region.pop
     849
     850        end
     851
     852        def set_plugin( plugin )
     853                @plugin = plugin
     854        end
     855
     856        def self.get_plugin
     857                @@generator_stack[@@generator_nest].get_plugin
     858        end
     859
     860        def get_plugin
     861                @plugin
     862        end
     863
     864        def parse(files)
     865
     866                # mikan Namespace.push
     867                Celltype.push
     868                Cell.push
     869                CompositeCelltype.push
     870                Region.push
     871
     872                @@generator_nest += 1
     873                @@generator_stack[@@generator_nest] = self
     874                @b_no_type_name = false
     875
     876        begin
     877
     878                @q = []
     879                comment = false
     880#               b_asm   = false
     881
     882                # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
     883                TECS_LANG::set_kcode_binary
     884
     885                # 800U, 0xffLL など (整数リテラルに共通の修飾子)
     886                integer_qualifier = "([Uu][Ll][Ll]|[Uu][Ll]|[Uu]|[Ll][Ll]|[Ll])?"
     887
     888                files.each {|file|
     889                        lineno = 1
     890                begin
     891#2.0            IO.foreach(file) {|line|
     892                        TECSIO.foreach(file) {|line|
     893                        col = 1
     894                        line.rstrip!
     895
     896                        until line.empty?
     897
     898                                if comment
     899                                        case line
     900                                        # コメント終了
     901                                        when /\A\*\//
     902                                                comment = false
     903                                        when /\A./
     904                                                ;
     905                                        end
     906                                else
     907                                        case line
     908                                        # 空白、プリプロセスディレクティブ
     909                                        when /\A\s+/
     910                                                ;
     911                                        # 識別子
     912                                        when /\A[a-zA-Z_]\w*/
     913                                                word = $&
     914                                                @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)]
     915                                        # 16 進数定数
     916                                        when /\A0x[0-9A-Fa-f]+#{integer_qualifier}/
     917                                                @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)]
     918                                        # 8 進数定数
     919                                        when /\A0[0-7]+#{integer_qualifier}/
     920                                                @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)]
     921                                        # 浮動小数定数
     922                                        when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/
     923                                                @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
     924                                        # 整数定数
     925                                        when /\A\d+#{integer_qualifier}/
     926                                        # when /\A\d+/
     927                                                @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)]
     928                                        # 文字
     929                                        when /\A'(?:[^'\\]|\\.)'/
     930                                                @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)]
     931                                        # 文字列
     932#                                       "#include  #include #include \"../systask/logtask.cfg\"       最後の " 忘れ)で無限ループ
     933#                                       when /\A"(?:[^"\\]+|\\.)*"/
     934                                        when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
     935                                                @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)]
     936                                        # 行コメント
     937                                        when /\A\/\/.*$/
     938                                                # 読み飛ばすだけ
     939                                        # コメント開始
     940                                        when /\A\/\*/
     941                                                comment = true
     942                                        when /\A>>=/, /\A<<=/, /\A>>/,  /\A<</
     943                                                @q << [$&, Token.new($&, file, lineno, col)]
     944                                        when /\A\+=/, /\A\-=/, /\A\*=/, /\A\/=/, /\A%=/, /\A&=/, /\A\|=/, /\A\^=/
     945                                                @q << [$&, Token.new($&, file, lineno, col)]
     946                                        when /\A::/, /\A==/, /\A!=/, /\A>=/, /\A<=/, /\A\->/, /\A\+\+/, /\A\-\-/
     947                                                @q << [$&, Token.new($&, file, lineno, col)]
     948                                        when /\A\|\|/, /\A\&\&/
     949                                                @q << [$&, Token.new($&, file, lineno, col)]
     950                                        when /\A./
     951                                                @q << [$&, Token.new($&, file, lineno, col)]
     952                                        else
     953                                                raise
     954                                        end
     955                                end
     956
     957                                line = $'
     958                                col += $&.length
     959                        end
     960
     961                        lineno += 1
     962                }
     963
     964                rescue => evar
     965                        Generator.error( "B1002 while open or reading \'$1\'" , file )
     966                        print_exception( evar )
     967                end
     968        }
     969
     970        # 終了の印
     971        @q << nil
     972
     973        @yydebug = true
     974        do_parse
     975
     976        ensure
     977                @@generator_nest -= 1
     978                TECS_LANG::reset_kcode
     979        end
     980
     981        end
     982
     983
     984        def next_token
     985                token = @q.shift
     986
     987                if token then
     988                        @@current_locale[@@generator_nest] = token[1].locale
     989
     990                        case token[1].val
     991                        when ";", ":", ",", "(", ")", "{", "}"
     992                        set_no_type_name false
     993                        when ".", "->"
     994                        set_no_type_name true
     995                        end
     996
     997                        # TYPE_NAME トークンへ置き換え
     998                        if @b_no_type_name == false
     999                                if token[0] == :IDENTIFIER && Namespace.is_typename?( token[1].val ) then
     1000                                        token[0] = :TYPE_NAME
     1001                                        locale = @@current_locale[@@generator_nest]
    9381002#print( "#{locale[0]}: line #{locale[1]} : #{token[0]} '#{token[1].val}: type_name'\n" )
    939         end
    940       end
    941 
    942       if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
    943         locale = @@current_locale[@@generator_nest]
    944         if token then
    945           print( "#{locale[0]}: line #{locale[1]} : #{token[0]} '#{token[1].val}'\n" )
    946         else
    947           print( "#{locale[0]}: line #{locale[1]} : EOF\n" )
    948         end
    949       end
    950     end
    951 
    952     token
    953   end
    954 
    955   def on_error(t, v, vstack)
    956     if v == "$" then
    957      Generator.error( "B1003 Unexpected EOF"  )
    958     else
    959      Generator.error( "B1004 syntax error near \'$1\'" , v.val )
    960     end
    961 
    962   end
    963 
    964   def self.current_locale
    965     @@current_locale[ @@generator_nest ]
    966   end
    967 
    968   @@n_error = 0
    969   @@n_warning = 0
    970   @@n_info = 0
    971 
    972   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
    973   def self.error( msg )
    974     @@n_error += 1
    975     locale = @@current_locale[ @@generator_nest ]
    976 
    977     if locale then
    978       Console.puts "error: #{locale[0]}: line #{locale[1]} #{msg}"
    979     else
    980       Console.puts "error: #{msg}"
    981     end
    982   end
    983 
    984   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
    985   def self.warning( msg )
    986     @@n_warning += 1
    987     locale = @@current_locale[ @@generator_nest ]
    988     Console.puts "warning: #{locale[0]}: line #{locale[1]} #{msg}"
    989   end
    990 
    991   # このメソッドは構文解析、意味解析からのみ呼出し可
    992   def self.info( msg )
    993     @@n_info += 1
    994     locale = @@current_locale[ @@generator_nest ]
    995     Console.puts "info: #{locale[0]}: line #{locale[1]} #{msg}"
    996   end
    997 
    998   def self.get_n_error
    999     @@n_error
    1000   end
    1001 
    1002   def self.get_n_warning
    1003     @@n_warning
    1004   end
    1005 
    1006   def self.get_nest
    1007     @@generator_nest
    1008   end
    1009 
    1010   def set_no_type_name b_no_type_name
    1011     locale = @@current_locale[ @@generator_nest ]
     1003                                end
     1004                        end
     1005
     1006                        if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
     1007                                locale = @@current_locale[@@generator_nest]
     1008                                if token then
     1009                                        print( "#{locale[0]}: line #{locale[1]} : #{token[0]} '#{token[1].val}'\n" )
     1010                                else
     1011                                        print( "#{locale[0]}: line #{locale[1]} : EOF\n" )
     1012                                end
     1013                        end
     1014                end
     1015
     1016                token
     1017        end
     1018
     1019        def on_error(t, v, vstack)
     1020                if v == "$" then
     1021                        Generator.error( "B1003 Unexpected EOF"  )
     1022                else
     1023                        Generator.error( "B1004 syntax error near \'$1\'" , v.val )
     1024                end
     1025
     1026        end
     1027
     1028        def self.current_locale
     1029                @@current_locale[ @@generator_nest ]
     1030        end
     1031
     1032        @@n_error = 0
     1033        @@n_warning = 0
     1034        @@n_info = 0
     1035
     1036        # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
     1037        def self.error( msg )
     1038                @@n_error += 1
     1039                locale = @@current_locale[ @@generator_nest ]
     1040
     1041                if locale then
     1042                        Console.puts "error: #{locale[0]}: line #{locale[1]} #{msg}"
     1043                else
     1044                        Console.puts "error: #{msg}"
     1045                end
     1046        end
     1047
     1048        # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
     1049        def self.warning( msg )
     1050                @@n_warning += 1
     1051                locale = @@current_locale[ @@generator_nest ]
     1052                Console.puts "warning: #{locale[0]}: line #{locale[1]} #{msg}"
     1053        end
     1054
     1055        # このメソッドは構文解析、意味解析からのみ呼出し可
     1056        def self.info( msg )
     1057                @@n_info += 1
     1058                locale = @@current_locale[ @@generator_nest ]
     1059                Console.puts "info: #{locale[0]}: line #{locale[1]} #{msg}"
     1060        end
     1061
     1062        def self.get_n_error
     1063                @@n_error
     1064        end
     1065
     1066        def self.get_n_warning
     1067                @@n_warning
     1068        end
     1069
     1070        def self.get_nest
     1071                @@generator_nest
     1072        end
     1073
     1074        def set_no_type_name b_no_type_name
     1075                locale = @@current_locale[ @@generator_nest ]
    10121076#print "b_no_type_name=#{b_no_type_name} #{locale[0]}: line #{locale[1]}\n"
    1013     @b_no_type_name = b_no_type_name
    1014   end
     1077                @b_no_type_name = b_no_type_name
     1078        end
    10151079
    10161080---- footer
Note: See TracChangeset for help on using the changeset viewer.