Ignore:
Timestamp:
May 22, 2019, 10:03:37 PM (5 years ago)
Author:
coas-nagasima
Message:

ビルドが通るよう更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • azure_iot_hub/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
    r388 r389  
    66#   Copyright (C) 2008-2018 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
    5237#   $Id$
     
    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#
    68 # 2019/3/28 長島 下記のC99の構文に近づくよう変更
    69 #(読めないヘッダーファイルがあったため)
     51# 2019/3/28 長島 下記のC99の構文に近づくよう変更
     52#(読めないヘッダーファイルがあったため)
    7053# http://www.quut.com/c/ANSI-C-grammar-y-1999.html
    71 # å
    72 ƒã€
    73 ã®ã‚³ãƒ¡ãƒ³ãƒˆã¨åˆã‚ãªããªã£ã¦ã„ます
     54# 元々のコメントと合わなくなっています
    7455
    7556primary_expression
    7657                : namespace_identifier
    7758                { result = [ :IDENTIFIER, val[0] ] }     #1ok
    78 #        : IDENTIFIER   # mikan namespace への対応
     59#        : IDENTIFIER   # mikan namespace への対応
    7960#               { result = [ :IDENTIFIER, val[0] ] }
    8061#        | TRUE
     
    10384                { result << val[1] }
    10485
    105 # 関数呼び出しと後置インクリメント、デクリメント演算子がない
     86# 関数呼び出しと後置インクリメント、デクリメント演算子がない
    10687postfix_expression
    10788                : primary_expression
     
    11596                | postfix_expression '->' IDENTIFIER
    11697                { result = [ :OP_REF, val[0], val[2] ] }
    117                 | postfix_expression '++'       { result = val[0] }   # ++, -- は無視する
     98                | postfix_expression '++'       { result = val[0] }   # ++, -- は無視する
    11899                | postfix_expression '--'       { result = val[0] }
    119100                | '(' type_name ')' '{' initializer_list '}'
     
    125106
    126107
    127 # 前置インクリメント、デクリメント演算子がない
     108# 前置インクリメント、デクリメント演算子がない
    128109unary_expression
    129110                : postfix_expression
     
    134115                | SIZEOF '(' type_name ')'
    135116                { result = [ :OP_SIZEOF_TYPE, val[1] ] }
    136                 | '++' unary_expression                 { result = val[1] }   # ++, -- は無視する
     117                | '++' unary_expression                 { result = val[1] }   # ++, -- は無視する
    137118                | '--' unary_expression                 { result = val[1] }
    138119
     
    246227                | expression ',' assignment_expression
    247228                {
    248                         result = Expression.new( val[2] )    # ',' の後ろを採用
     229                        result = Expression.new( val[2] )    # ',' の後ろを採用
    249230                }
    250231
     
    264245
    265246# Types
    266 ##########################  宣言  ##########################
    267 # 宣言もK&Rと一部異なる
    268 
    269 # declarationはセルの属性で使われる
    270 # K&Rとの違い: storage classが指定できない、型が省略できない
     247##########################  宣言  ##########################
     248# 宣言もK&Rと一部異なる
     249
     250# declarationはセルの属性で使われる
     251# K&Rとの違い: storage classが指定できない、型が省略できない
    271252declaration
    272253                : declaration_specifiers init_declarator_list ';'
    273254#        : specifier_qualifier_list init_declarator_list ';'
    274255
    275 # declaration_specifiersは関数のパラメータで使われるが、
    276 # specifier_qualifier_listで十分かもしれない
     256# declaration_specifiersは関数のパラメータで使われるが、
     257# specifier_qualifier_listで十分かもしれない
    277258
    278259declaration_specifiers
    279260                : storage_class_specifier
    280261                {
    281                         result = CIntType.new( -3 )    # storage class は無視
     262                        result = CIntType.new( -3 )    # storage class は無視
    282263                }
    283264                | storage_class_specifier declaration_specifiers
    284265                {
    285                         result = val[1]                # storage class は無視
     266                        result = val[1]                # storage class は無視
    286267                }
    287268                | type_specifier
     
    350331                { set_no_type_name true; result = CBoolType.new }
    351332                | struct_specifier
    352                 { set_no_type_name true; result = val[0] } # set_no_type_name true は struct_tag でも呼ばれる
     333                { set_no_type_name true; result = val[0] } # set_no_type_name true は struct_tag でも呼ばれる
    353334                | union_specifier
    354                 { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
     335                { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
    355336                | enum_specifier
    356                 { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
     337                { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
    357338                | TYPE_NAME
    358339                { set_no_type_name true; result = CDefinedType.new( val[0].val ) }
    359340
    360 # mikan K&Rのstruct_or_union_specifierに相当するが、unionは使えない, bit field にも対応しない
     341# mikan K&Rのstruct_or_union_specifierに相当するが、unionは使えない, bit field にも対応しない
    361342struct_specifier                # mikan
    362343#        : STRUCT struct_tag '{'
     
    379360                        result = val[1]
    380361                }
    381 #        | STRUCT struct_tag   # mikan struct_tag は namespace 対応がå¿
    382 è¦
    383                 | struct_term struct_tag   # mikan struct_tag は namespace 対応がå¿
    384 è¦
     362#        | STRUCT struct_tag   # mikan struct_tag は namespace 対応が必要
     363                | struct_term struct_tag   # mikan struct_tag は namespace 対応が必要
    385364                {
    386365                        StructType.set_define( false )
     
    403382                }
    404383
    405 # ポインタ修飾子を追加
     384# ポインタ修飾子を追加
    406385struct_declaration
    407386                : declaration_specifiers struct_declarator_list ';'
     
    416395                        result = val[1]
    417396                }
    418                 # ビットフィールドを読み飛ばし
     397                # ビットフィールドを読み飛ばし
    419398                | declaration_specifiers struct_declarator_list ':' constant_expression ';'
    420399                {
     
    427406                        result = val[1]
    428407                }
    429                 | union_specifier ';'                       # 無名
    430                 | struct_specifier ';'                       # 無名
    431 
    432 
    433 
    434 # K&Rのspecifier_qualifier_listと同じ
    435 # 名前がまぎらわしかったのでtype_を付けた
     408                | union_specifier ';'                       # 無名
     409                | struct_specifier ';'                       # 無名
     410
     411
     412
     413# K&Rのspecifier_qualifier_listと同じ
     414# 名前がまぎらわしかったのでtype_を付けた
    436415specifier_qualifier_list
    437416                : type_specifier specifier_qualifier_list
     
    457436                { result << val[2] }
    458437
    459 # ビットフィールドは使えない
     438# ビットフィールドは使えない
    460439struct_declarator
    461440                : declarator
     
    466445#        : UNION union_tag '{' union_declaration_list '}'
    467446#        | UNION '{' union_declaration_list '}'
    468 #        | UNION union_tag   # mikan struct_tag は namespace 対応がå¿
    469 è¦
     447#        | UNION union_tag   # mikan struct_tag は namespace 対応が必要
    470448                : union_term union_tag '{' union_declaration_list '}'
    471449                | union_term '{' union_declaration_list '}'
    472                 | union_term union_tag   # mikan struct_tag は namespace 対応がå¿
    473 è¦
     450                | union_term union_tag   # mikan struct_tag は namespace 対応が必要
    474451
    475452union_term
     
    485462union_declaration
    486463                : declaration_specifiers union_declarator_list ';'
    487                 | union_specifier ';'                       # 無名
    488                 | struct_specifier ';'                      # 無名
     464                | union_specifier ';'                       # 無名
     465                | struct_specifier ';'                      # 無名
    489466
    490467union_declarator_list
     
    535512                }
    536513                | direct_declarator
    537                 | pointer TYPE_NAME     # 関数ポインタの typedef が二重定義の場合
     514                | pointer TYPE_NAME     # 関数ポインタの typedef が二重定義の場合
    538515                {
    539516                        result = Decl.new( val[1].val )
     
    562539                        result = val[0]
    563540                }
    564                 | direct_declarator '(' identifier_list ')'  # これは何のためにå¿
    565 è¦ï¼Ÿ 060211
     541                | direct_declarator '(' identifier_list ')'  # これは何のために必要? 060211
    566542                | direct_declarator '(' ')'
    567543                {
     
    599575                : parameter_list
    600576                | parameter_list ',' '.' '.' '.'
    601                 # mikan 可変長パラメータ,  ... の間のスペースが許される(手抜き)
     577                # mikan 可変長パラメータ,  ... の間のスペースが許される(手抜き)
    602578
    603579parameter_list
     
    607583#               {
    608584#                       val[0].add_param( val[2] )
    609 #                       # result = val[0] 不要
     585#                       # result = val[0] 不要
    610586#               }
    611587
    612588
    613 # パラメータ修飾子を追加
     589# パラメータ修飾子を追加
    614590parameter_declaration
    615591                : declaration_specifiers declarator
     
    620596#               }
    621597
    622         # 以下はエラーとする
    623 #        | declaration_specifiers       # 仮引数なしは、とりあえず扱わない 060210
     598        # 以下はエラーとする
     599#        | declaration_specifiers       # 仮引数なしは、とりあえず扱わない 060210
    624600#               {
    625601#                       unless val[0].kind_of?( VoidType ) then
     
    628604#                       result = nil
    629605#               }
    630                 | declaration_specifiers abstract_declarator    # 仮引数なし
    631                 | declaration_specifiers                                                # 仮引数なし
    632 
    633 
    634 identifier_list       # 060211  不用になった
     606                | declaration_specifiers abstract_declarator    # 仮引数なし
     607                | declaration_specifiers                                                # 仮引数なし
     608
     609
     610identifier_list       # 060211  不用になった
    635611        : IDENTIFIER
    636612        | identifier_list ',' IDENTIFIER
     
    662638                | direct_abstract_declarator '(' parameter_type_list ')'
    663639
    664 # assignment_expressionをconstant_expressionに変更
     640# assignment_expressionをconstant_expressionに変更
    665641initializer                     # mikan
    666642                : assignment_expression
     
    685661
    686662
    687 ##########################  ここからはCDL独自  ##########################
    688 
    689 #トップレベルの構文規則
     663##########################  ここからはCDL独自  ##########################
     664
     665#トップレベルの構文規則
    690666C_parser
    691667                :
     
    703679                | declaration
    704680                | ';'
    705                 | error   # エラー回復ポイント
     681                | error   # エラー回復ポイント
    706682
    707683typedef
     
    792768                : _ASM {
    793769                while true
    794                         # ';' が表れるまで、トークンを読み飛ばす。
    795                         # gcc の構文拡張に対応すべきだが、単純な実è£
    796 ã¨ã—て、';' まで読み飛ばす。
    797                         # トークン単位で読み飛ばしているので、文字列やコメントå†
    798 ã® ';' は対象にならない。
     770                        # ';' が表れるまで、トークンを読み飛ばす。
     771                        # gcc の構文拡張に対応すべきだが、単純な実装として、';' まで読み飛ばす。
     772                        # トークン単位で読み飛ばしているので、文字列やコメント内の ';' は対象にならない。
    799773                        token = next_token
    800774                        if token[1].val == ";"
     
    906880#               b_asm   = false
    907881
    908                 # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
     882                # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
    909883                TECS_LANG::set_kcode_binary
    910884
    911                 # 800U, 0xffLL など (整数リテラルにå
    912 ±é€šã®ä¿®é£¾å­)
     885                # 800U, 0xffLL など (整数リテラルに共通の修飾子)
    913886                integer_qualifier = "([Uu][Ll][Ll]|[Uu][Ll]|[Uu]|[Ll][Ll]|[Ll])?"
    914887
     
    925898                                if comment
    926899                                        case line
    927                                         # コメント終了
     900                                        # コメント終了
    928901                                        when /\A\*\//
    929902                                                comment = false
     
    933906                                else
    934907                                        case line
    935                                         # 空白、プリプロセスディレクティブ
     908                                        # 空白、プリプロセスディレクティブ
    936909                                        when /\A\s+/
    937910                                                ;
    938                                         # 識別子
     911                                        # 識別子
    939912                                        when /\A[a-zA-Z_]\w*/
    940913                                                word = $&
    941914                                                @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)]
    942                                         # 16 進数定数
     915                                        # 16 進数定数
    943916                                        when /\A0x[0-9A-Fa-f]+#{integer_qualifier}/
    944917                                                @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)]
    945                                         # 8 進数定数
     918                                        # 8 進数定数
    946919                                        when /\A0[0-7]+#{integer_qualifier}/
    947920                                                @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)]
    948                                         # 浮動小数定数
     921                                        # 浮動小数定数
    949922                                        when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/
    950923                                                @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
    951                                         # 整数定数
     924                                        # 整数定数
    952925                                        when /\A\d+#{integer_qualifier}/
    953926                                        # when /\A\d+/
    954927                                                @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)]
    955                                         # 文字
     928                                        # 文字
    956929                                        when /\A'(?:[^'\\]|\\.)'/
    957930                                                @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)]
    958                                         # 文字列
    959 #                                       "#include  #include #include \"../systask/logtask.cfg\"       æœ€å¾Œã® " 忘れ)で無限ループ
     931                                        # 文字列
     932#                                       "#include  #include #include \"../systask/logtask.cfg\"       最後の " 忘れ)で無限ループ
    960933#                                       when /\A"(?:[^"\\]+|\\.)*"/
    961                                         when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
     934                                        when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
    962935                                                @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)]
    963                                         # 行コメント
     936                                        # 行コメント
    964937                                        when /\A\/\/.*$/
    965                                                 # 読み飛ばすだけ
    966                                         # コメント開始
     938                                                # 読み飛ばすだけ
     939                                        # コメント開始
    967940                                        when /\A\/\*/
    968941                                                comment = true
     
    995968        }
    996969
    997         # 終了の印
     970        # 終了の印
    998971        @q << nil
    999972
     
    1022995                        end
    1023996
    1024                         # TYPE_NAME トークンへ置き換え
     997                        # TYPE_NAME トークンへ置き換え
    1025998                        if @b_no_type_name == false
    1026999                                if token[0] == :IDENTIFIER && Namespace.is_typename?( token[1].val ) then
     
    10311004                        end
    10321005
    1033                         if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
     1006                        if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
    10341007                                locale = @@current_locale[@@generator_nest]
    10351008                                if token then
     
    10611034        @@n_info = 0
    10621035
    1063         # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
     1036        # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
    10641037        def self.error( msg )
    10651038                @@n_error += 1
     
    10731046        end
    10741047
    1075         # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
     1048        # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
    10761049        def self.warning( msg )
    10771050                @@n_warning += 1
     
    10801053        end
    10811054
    1082         # このメソッドは構文解析、意味解析からのみ呼出し可
     1055        # このメソッドは構文解析、意味解析からのみ呼出し可
    10831056        def self.info( msg )
    10841057                @@n_info += 1
Note: See TracChangeset for help on using the changeset viewer.