Ignore:
Timestamp:
Aug 23, 2017, 9:27:43 AM (7 years ago)
Author:
coas-nagasima
Message:

文字コードを設定

File:
1 edited

Legend:

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

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    8 #   ä¸Šè¨˜è‘—作権è€
    9 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    10 #   ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    11 #   å¤‰ãƒ»å†é
    12 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    13 #   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    14 #       æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    15 #       ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    16 #   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    17 #       ç”¨ã§ãã‚‹å½¢ã§å†é
    18 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    19 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    20 #       è€
    21 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    22 #       ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    23 #   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    24 #       ç”¨ã§ããªã„形で再é
    25 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    26 #       ã¨ï¼Ž
    27 #     (a) 再é
    28 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    29 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    30 #         ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    31 #     (b) 再é
    32 å¸ƒã®å½¢æ
    33 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    34 #         å ±å‘Šã™ã‚‹ã“と.
    35 #   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    36 #       å®³ã‹ã‚‰ã‚‚,上記著作権è€
    37 ãŠã‚ˆã³TOPPERSプロジェクトをå
    38 è²¬ã™ã‚‹ã“と.
    39 #       ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    40 #       ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    41 ãŠã‚ˆã³TOPPERSプロジェクトを
    42 #       å
    43 è²¬ã™ã‚‹ã“と.
     8#   上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
     9#   ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     10#   変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     11#   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     12#       権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     13#       スコード中に含まれていること.
     14#   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     15#       用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     16#       者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     17#       の無保証規定を掲載すること.
     18#   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     19#       用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     20#       と.
     21#     (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     22#         作権表示,この利用条件および下記の無保証規定を掲載すること.
     23#     (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     24#         報告すること.
     25#   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     26#       害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     27#       また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     28#       由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     29#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: C_parser.y.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
    5540class C_parser
    5641rule
    57 # トップレベルの構文要素は C_parser
     42# トップレベルの構文要素は C_parser
    5843all: C_parser
    5944
    6045# Expr
    61 ##########################  式  ##########################
    62 # K&Rの文法(プログラミング言語C 第2版 付録)と一部異なる
    63 # argument_expression_list(関数引数), assignment_expression(代å
    64 ¥)がない
    65 # 式の result は、すべてé
    66 åˆ—で第一要素が識別シンボル、第二要素以下が引数
     46##########################  式  ##########################
     47# K&Rの文法(プログラミング言語C 第2版 付録)と一部異なる
     48# argument_expression_list(関数引数), assignment_expression(代入)がない
     49# 式の result は、すべて配列で第一要素が識別シンボル、第二要素以下が引数
    6750
    6851primary_expression
    6952        : namespace_identifier
    7053                { result = [ :IDENTIFIER, val[0] ] }     #1ok
    71 #        : IDENTIFIER   # mikan namespace への対応
     54#        : IDENTIFIER   # mikan namespace への対応
    7255#               { result = [ :IDENTIFIER, val[0] ] }
    7356#        | TRUE
     
    9679                { result << val[1] }
    9780
    98 # 関数呼び出しと後置インクリメント、デクリメント演算子がない
     81# 関数呼び出しと後置インクリメント、デクリメント演算子がない
    9982postfix_expression
    10083        : primary_expression
     
    10790        | postfix_expression '->' IDENTIFIER
    10891                { result = [ :OP_REF, val[0], val[2] ] }
    109         | postfix_expression '++'       { result = val[0] }   # ++, -- は無視する
     92        | postfix_expression '++'       { result = val[0] }   # ++, -- は無視する
    11093        | postfix_expression '--'       { result = val[0] }
    11194
     
    11699
    117100
    118 # 前置インクリメント、デクリメント演算子がない
     101# 前置インクリメント、デクリメント演算子がない
    119102unary_expression
    120103        : postfix_expression
     
    125108        | SIZEOF '(' type_name ')'
    126109                { result = [ :OP_SIZEOF_TYPE, val[1] ] }
    127                 | '++' unary_expression                 { result = val[1] }   # ++, -- は無視する
     110                | '++' unary_expression                 { result = val[1] }   # ++, -- は無視する
    128111                | '--' unary_expression                 { result = val[1] }
    129112
     
    213196
    214197
    215 # コンマ演算子が使えない
     198# コンマ演算子が使えない
    216199expression
    217200        : conditional_expression
     
    238221
    239222# Types
    240 ##########################  宣言  ##########################
    241 # 宣言もK&Rと一部異なる
    242 
    243 # declarationはセルの属性で使われる
    244 # K&Rとの違い: storage classが指定できない、型が省略できない
     223##########################  宣言  ##########################
     224# 宣言もK&Rと一部異なる
     225
     226# declarationはセルの属性で使われる
     227# K&Rとの違い: storage classが指定できない、型が省略できない
    245228declaration
    246229        : declaration_specifiers init_declarator_list ';'
    247230#        : type_specifier_qualifier_list init_declarator_list ';'
    248231
    249 # declaration_specifiersは関数のパラメータで使われるが、
    250 # type_specifier_qualifier_listで十分かもしれない
     232# declaration_specifiersは関数のパラメータで使われるが、
     233# type_specifier_qualifier_listで十分かもしれない
    251234
    252235declaration_specifiers
    253236        : storage_class
    254237                {
    255                         result = CIntType.new( -3 )    # storage class は無視
     238                        result = CIntType.new( -3 )    # storage class は無視
    256239                }
    257240        | type_specifier
     
    263246        | storage_class declaration_specifiers
    264247                {
    265                         result = val[1]                # storage class は無視
     248                        result = val[1]                # storage class は無視
    266249                }
    267250        | type_specifier declaration_specifiers
     
    292275        | DOUBLE        { set_no_type_name true; result = CFloatType.new(-64) }
    293276        | BOOL  { set_no_type_name true; result = CBoolType.new }
    294         | struct_specifier      { set_no_type_name true; result = val[0] } # set_no_type_name true は struct_tag でも呼ばれる
    295         | union_specifier       { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
    296         | enum_specifier        { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
     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 が宣言されたとする
    297280        | TYPE_NAME     { set_no_type_name true; result = CDefinedType.new( val[0].val ) }
    298281
     
    314297                }
    315298
    316 # mikan K&Rのstruct_or_union_specifierに相当するが、unionは使えない, bit field にも対応しない
     299# mikan K&Rのstruct_or_union_specifierに相当するが、unionは使えない, bit field にも対応しない
    317300struct_specifier                # mikan
    318301        : STRUCT struct_tag '{'
     
    333316                        result = val[1]
    334317                }
    335         | STRUCT struct_tag   # mikan struct_tag は namespace 対応がå¿
    336 è¦
     318        | STRUCT struct_tag   # mikan struct_tag は namespace 対応が必要
    337319                {
    338320                        StructType.set_define( false )
     
    352334                }
    353335
    354 # ポインタ修飾子を追加
     336# ポインタ修飾子を追加
    355337struct_declaration
    356338        : declaration_specifiers struct_declarator_list ';'
     
    365347                        result = val[1]
    366348                }
    367         | union_specifier ';'                       # 無名
    368         | struct_specifier ';'                       # 無名
    369 
    370 
    371 
    372 # K&Rのspecifier_qualifier_listと同じ
    373 # 名前がまぎらわしかったのでtype_を付けた
     349        | union_specifier ';'                       # 無名
     350        | struct_specifier ';'                       # 無名
     351
     352
     353
     354# K&Rのspecifier_qualifier_listと同じ
     355# 名前がまぎらわしかったのでtype_を付けた
    374356type_specifier_qualifier_list
    375357        : type_specifier
     
    395377                { result << val[2] }
    396378
    397 # ビットフィールドは使えない
     379# ビットフィールドは使えない
    398380struct_declarator
    399381        : declarator
     
    404386        : UNION union_tag '{' union_declaration_list '}'
    405387        | UNION '{' union_declaration_list '}'
    406         | UNION union_tag   # mikan struct_tag は namespace 対応がå¿
    407 è¦
     388        | UNION union_tag   # mikan struct_tag は namespace 対応が必要
    408389
    409390union_declaration_list
     
    416397union_declaration
    417398        : declaration_specifiers union_declarator_list ';'
    418                 | union_specifier ';'                       # 無名
    419                 | struct_specifier ';'                      # 無名
     399                | union_specifier ';'                       # 無名
     400                | struct_specifier ';'                      # 無名
    420401
    421402union_declarator_list
     
    423404        | union_declarator_list ',' union_declarator
    424405
    425 # ビットフィールドは使えない
     406# ビットフィールドは使えない
    426407union_declarator
    427408        : declarator
     
    429410
    430411
    431 # enumの種類を追加
     412# enumの種類を追加
    432413enum_specifier          # mikan
    433414        : enum_type            '{' enumerator_list '}'
     
    462443                }
    463444        | direct_declarator
    464         | pointer TYPE_NAME     # 関数ポインタの typedef が二重定義の場合
     445        | pointer TYPE_NAME     # 関数ポインタの typedef が二重定義の場合
    465446                {
    466447                        result = Decl.new( val[1].val )
     
    490471                }
    491472
    492 #        | direct_declarator '(' identifier_list ')'  # これは何のためにå¿
    493 è¦ï¼Ÿ 060211
     473#        | direct_declarator '(' identifier_list ')'  # これは何のために必要? 060211
    494474        | direct_declarator '(' ')'
    495475                {
     
    524504        : parameter_list
    525505        | parameter_list ',' '.' '.' '.'
    526                 # mikan 可変長パラメータ,  ... の間のスペースが許される(手抜き)
     506                # mikan 可変長パラメータ,  ... の間のスペースが許される(手抜き)
    527507
    528508parameter_list
     
    532512#               {
    533513#                       val[0].add_param( val[2] )
    534 #                       # result = val[0] 不要
     514#                       # result = val[0] 不要
    535515#               }
    536516
    537517
    538 # パラメータ修飾子を追加
     518# パラメータ修飾子を追加
    539519parameter_declaration
    540520        : declaration_specifiers declarator
     
    545525#               }
    546526
    547         # 以下はエラーとする
    548 #        | declaration_specifiers       # 仮引数なしは、とりあえず扱わない 060210
     527        # 以下はエラーとする
     528#        | declaration_specifiers       # 仮引数なしは、とりあえず扱わない 060210
    549529#               {
    550530#                       unless val[0].kind_of?( VoidType ) then
     
    553533#                       result = nil
    554534#               }
    555         | declaration_specifiers abstract_declarator    # 仮引数なし
    556         | declaration_specifiers                                                # 仮引数なし
    557 
    558 
    559 #identifier_list       # 060211  不用になった
     535        | declaration_specifiers abstract_declarator    # 仮引数なし
     536        | declaration_specifiers                                                # 仮引数なし
     537
     538
     539#identifier_list       # 060211  不用になった
    560540#        : IDENTIFIER
    561541#        | identifier_list ',' IDENTIFIER
     
    587567        | direct_abstract_declarator '(' parameter_type_list ')'
    588568
    589 # assignment_expressionをconstant_expressionに変更
     569# assignment_expressionをconstant_expressionに変更
    590570initializer                     # mikan
    591571        : constant_expression
     
    610590
    611591
    612 ##########################  ここからはCDL独自  ##########################
    613 
    614 #トップレベルの構文規則
     592##########################  ここからはCDL独自  ##########################
     593
     594#トップレベルの構文規則
    615595C_parser
    616596        :
     
    628608        | declaration
    629609        | ';'
    630         | error   # エラー回復ポイント
     610        | error   # エラー回復ポイント
    631611
    632612typedef
     
    826806    comment = false
    827807
    828     # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
     808    # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
    829809    TECS_LANG::set_kcode_binary
    830810
    831     # 800U, 0xffLL など (整数リテラルにå
    832 ±é€šã®ä¿®é£¾å­)
     811    # 800U, 0xffLL など (整数リテラルに共通の修飾子)
    833812    integer_qualifier = "([Uu][Ll][Ll]|[Uu][Ll]|[Uu]|[Ll][Ll]|[Ll])?"
    834813
     
    845824          if comment
    846825            case line
    847             # コメント終了
     826            # コメント終了
    848827            when /\A\*\//
    849828              comment = false
     
    853832          else
    854833            case line
    855             # 空白、プリプロセスディレクティブ
     834            # 空白、プリプロセスディレクティブ
    856835            when /\A\s+/
    857836              ;
    858             # 識別子
     837            # 識別子
    859838            when /\A[a-zA-Z_]\w*/
    860839              word = $&
    861840              @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)]
    862             # 16 進数定数
     841            # 16 進数定数
    863842            when /\A0x[0-9A-Fa-f]+#{integer_qualifier}/
    864843              @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)]
    865             # 8 進数定数
     844            # 8 進数定数
    866845            when /\A0[0-7]+#{integer_qualifier}/
    867846              @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)]
    868             # 浮動小数定数
     847            # 浮動小数定数
    869848            when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/
    870849              @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
    871             # 整数定数
     850            # 整数定数
    872851            when /\A\d+#{integer_qualifier}/
    873852            # when /\A\d+/
    874853              @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)]
    875             # 文字
     854            # 文字
    876855            when /\A'(?:[^'\\]|\\.)'/
    877856              @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)]
    878             # 文字列
    879 #              "#include  #include #include \"../systask/logtask.cfg\"       æœ€å¾Œã® " 忘れ)で無限ループ
     857            # 文字列
     858#              "#include  #include #include \"../systask/logtask.cfg\"       最後の " 忘れ)で無限ループ
    880859#            when /\A"(?:[^"\\]+|\\.)*"/
    881             when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
     860            when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
    882861              @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)]
    883             # 行コメント
     862            # 行コメント
    884863            when /\A\/\/.*$/
    885               # 読み飛ばすだけ
    886             # コメント開始
     864              # 読み飛ばすだけ
     865            # コメント開始
    887866            when /\A\/\*/
    888867              comment = true
     
    913892    }
    914893
    915     # 終了の印
     894    # 終了の印
    916895    @q << nil
    917896
     
    940919      end
    941920
    942       # TYPE_NAME トークンへ置き換え
     921      # TYPE_NAME トークンへ置き換え
    943922      if @b_no_type_name == false
    944923        if token[0] == :IDENTIFIER && Namespace.is_typename?( token[1].val ) then
     
    947926      end
    948927
    949       if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
     928      if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
    950929        locale = @@current_locale[@@generator_nest]
    951930        if token then
     
    976955  @@n_warning = 0
    977956
    978   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
     957  # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
    979958  def self.error( msg )
    980959    @@n_error += 1
     
    988967  end
    989968
    990   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
     969  # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
    991970  def self.warning( msg )
    992971    @@n_warning += 1
Note: See TracChangeset for help on using the changeset viewer.