- Timestamp:
- Aug 23, 2017, 9:27:43 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/bnf.y.rb
-
Property svn:mime-type
changed from
text/x-ruby
totext/x-ruby;charset=UTF-8
r270 r321 6 6 # Copyright (C) 2008-2016 by TOPPERS Project 7 7 #-- 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 # 免責すること. 44 30 # 45 # æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 46 ã 47 # ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 48 # ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 49 # ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 50 # ã®è²¬ä»»ãè² ããªãï¼ 31 # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 32 # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 33 # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 34 # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 35 # の責任を負わない. 51 36 # 52 # $Id : bnf.y.rb 1011 2016-07-11 02:20:01Z coas-nagasima$37 # $Id$ 53 38 #++ 54 39 55 40 class Generator 56 41 rule 57 # ãããã¬ãã«ã®æ§æè¦ç´ ã¯component_description42 # トップレベルの構文要素はcomponent_description 58 43 all: component_description 59 44 60 45 # 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 は、すべて配列で第一要素が識別シンボル、第二要素以下が引数 67 50 68 51 primary_expression … … 92 75 | string_literal_list STRING_LITERAL 93 76 { 94 # é£æ¥ããæååã1ã¤ã®æååã«ã¾ã¨ãã77 # 連接した文字列を1つの文字列にまとめる 95 78 str = "\"" + val[0].val.gsub( /\"(.*)\"/, "\\1" ) + val[1].val.gsub( /\"(.*)\"/, "\\1" ) + "\"" 96 79 result = Token.new( str, val[0].file, val[0].lineno, val[0].col ) 97 80 } 98 81 99 # é¢æ°å¼ã³åºãã¨å¾ç½®ã¤ã³ã¯ãªã¡ã³ãããã¯ãªã¡ã³ãæ¼ç®åããªã82 # 関数呼び出しと後置インクリメント、デクリメント演算子がない 100 83 postfix_expression 101 84 : primary_expression … … 107 90 { result = [ :OP_REF, val[0], val[2] ] } 108 91 109 # åç½®ã¤ã³ã¯ãªã¡ã³ãããã¯ãªã¡ã³ãæ¼ç®åããªã92 # 前置インクリメント、デクリメント演算子がない 110 93 unary_expression 111 94 : postfix_expression … … 202 185 203 186 204 # ã³ã³ãæ¼ç®åã使ããªã187 # コンマ演算子が使えない 205 188 expression 206 189 : conditional_expression … … 227 210 228 211 # Types 229 ########################## 宣è¨##########################230 # 宣è¨ãK&Rã¨ä¸é¨ç°ãªã231 232 # declaration ã¯ã»ã«ã®å±æ§ã§ä½¿ããã233 # K&R ã¨ã®éã: storage classãæå®ã§ããªããåãçç¥ã§ããªã212 ########################## 宣言 ########################## 213 # 宣言もK&Rと一部異なる 214 215 # declarationはセルの属性で使われる 216 # K&Rとの違い: storage classが指定できない、型が省略できない 234 217 declaration 235 218 : type_specifier_qualifier_list init_declarator_list ';' … … 241 224 } 242 225 243 # declaration_specifiers ã¯é¢æ°ã®ãã©ã¡ã¼ã¿ã§ä½¿ããããã244 # type_specifier_qualifier_list ã§ååãããããªã226 # declaration_specifiersは関数のパラメータで使われるが、 227 # type_specifier_qualifier_listで十分かもしれない 245 228 # Oyama 246 # const, volatile ã¯åç¬ã§åã«ãªããªãã®ã§å¤å½¢ 247 # const 㨠volatile ãåå± 248 ãããã¨ã¯ãªãã®ã§ãç¹°è¿ãæå®ã§ããªãããã«ãã 249 # type_specifier ãç¹°è¿ãæå®ã§ããå¿ 250 è¦ã¯ãªã (singed ãªã©åç¬ã§åã«ã¯ãªããªã) 229 # const, volatile は単独で型にならないので変形 230 # const と volatile が同居することはないので、繰返し指定できないようにした 231 # type_specifier も繰返し指定できる必要はない (singed など単独で型にはならない) 251 232 declaration_specifiers 252 233 : type_specifier … … 268 249 { val[0].set_initializer( val[2] ) } 269 250 270 # INT8 ããä¸ã¯K&Rã«ãªã251 # INT8から下はK&Rにない 271 252 # Oyama 272 # signed, unsigned ã¯åç¬ã§åã«ãªããªãã®ã§ãæ§æè¦ç´ ã¨ãã¦åé¢253 # signed, unsigned は単独で型にならないので、構文要素として分離 273 254 type_specifier 274 255 : VOID { result = VoidType.new } … … 278 259 | enum_specifier 279 260 | TYPE_NAME { result = DefinedType.new( val[0].val ) } 280 # | IDENTIFIER { result = DefinedType.new( val[0].val ) } # reduce/reduce conflict ãèµ·ãã£ã¦ãã¾ã261 # | IDENTIFIER { result = DefinedType.new( val[0].val ) } # reduce/reduce conflict が起こってしまう 281 262 | sign_int_type 282 263 | char_type … … 373 354 } 374 355 375 sign # TECS ã§ã¯ signed, unsigned åç¬ã§ã¯åã«ã§ããªã356 sign # TECS では signed, unsigned 単独では型にできない 376 357 : SIGNED { result = :SIGNED } 377 358 | UNSIGNED { result = :UNSIGNED } 378 359 379 # result[0] :CHAR ãªã©ã®ãã¼ã¯ã³ãresult[1] :CONST, :VOLATILE ãªã©360 # result[0] :CHAR などのトークン、result[1] :CONST, :VOLATILE など 380 361 sign_int_type 381 362 : sign int_type … … 386 367 | int_type 387 368 388 # K&R ã®struct_or_union_specifierã«ç¸å½ããããunionã¯ä½¿ããªã369 # K&Rのstruct_or_union_specifierに相当するが、unionは使えない 389 370 struct_specifier # mikan 390 371 : STRUCT struct_tag '{' … … 405 386 result = val[1] 406 387 } 407 | STRUCT struct_tag # mikan struct_tag 㯠namespace 対å¿ãå¿ 408 è¦ 388 | STRUCT struct_tag # mikan struct_tag は namespace 対応が必要 409 389 { 410 390 StructType.set_define( false ) … … 421 401 { result = StructType.new( val[0].val ) } 422 402 423 # ãã¤ã³ã¿ä¿®é£¾åã追å403 # ポインタ修飾子を追加 424 404 struct_declaration 425 405 : type_specifier_qualifier_list struct_declarator_list ';' … … 456 436 457 437 458 # K&R ã®specifier_qualifier_listã¨åã459 # ååãã¾ãããããã£ãã®ã§type_ãä»ãã438 # K&Rのspecifier_qualifier_listと同じ 439 # 名前がまぎらわしかったのでtype_を付けた 460 440 type_specifier_qualifier_list 461 # Oyama type_specifier ãç¹°ãè¿ãã¦æå®ãããã¨ã¯ãªããªã£ã (sign_int_type ã¨ããããï¼441 # Oyama type_specifier を繰り返して指定することはなくなった (sign_int_type としたため) 462 442 # : type_specifier type_specifier_qualifier_list 463 443 : type_specifier … … 467 447 result = val[1] 468 448 } 469 # mikan Oyama type_qualifier ã ãã§ã¯åæå®ã«ãªããªã : æ§æã¨ã©ã¼ã¨ãããããæå³ã¨ã©ã¼ã¨ããæ¹ã親å449 # mikan Oyama type_qualifier だけでは型指定にならない : 構文エラーとするより、意味エラーとした方が親切 470 450 # | type_qualifier 471 451 … … 477 457 { result << val[2] } 478 458 479 # ããããã£ã¼ã«ãã¯ä½¿ããªã459 # ビットフィールドは使えない 480 460 struct_declarator 481 461 : declarator 482 462 483 # enum ã®ç¨®é¡ã追å463 # enumの種類を追加 484 464 enum_specifier # mikan 485 465 : enum_type '{' enumerator_list '}' … … 535 515 result = val[0] 536 516 } 537 # | direct_declarator '(' identifier_list ')' # ããã¯ä½ã®ããã«å¿ 538 è¦ï¼ 060211 517 # | direct_declarator '(' identifier_list ')' # これは何のために必要? 060211 539 518 | direct_declarator '(' ')' 540 519 { … … 569 548 : parameter_list 570 549 | parameter_list ',' '...' 571 # mikan å¯å¤é·ãã©ã¡ã¼ã¿550 # mikan 可変長パラメータ 572 551 573 552 parameter_list … … 577 556 { 578 557 val[0].add_param( val[2] ) 579 # result = val[0] ä¸è¦580 } 581 582 583 # ãã©ã¡ã¼ã¿ä¿®é£¾åã追å558 # result = val[0] 不要 559 } 560 561 562 # パラメータ修飾子を追加 584 563 parameter_declaration 585 564 # : spec_L parameter_specifier_list spec_R declaration_specifiers declarator … … 592 571 } 593 572 594 # 以ä¸ã¯ã¨ã©ã¼ã¨ãã595 | declaration_specifiers declarator # parameter_specifier ãªãã¯æ±ããªã573 # 以下はエラーとする 574 | declaration_specifiers declarator # parameter_specifier なしは扱わない 596 575 { 597 576 Generator.error( "G1001 need specifier for \'$1\'" , val[1].get_name ) 598 577 result = nil 599 578 } 600 | declaration_specifiers # ä»®å¼æ°ãªãã¯ãã¨ããããæ±ããªã060210579 | declaration_specifiers # 仮引数なしは、とりあえず扱わない 060210 601 580 { 602 581 unless val[0].instance_of?( VoidType ) then … … 605 584 result = nil 606 585 } 607 # | '[' parameter_specifier_list ']' declaration_specifiers # å060210608 | parameter_specifier_list_bracket declaration_specifiers # å060210586 # | '[' parameter_specifier_list ']' declaration_specifiers # 同 060210 587 | parameter_specifier_list_bracket declaration_specifiers # 同 060210 609 588 { 610 589 unless val[1].instance_of?( VoidType ) then … … 647 626 result = val[1] 648 627 else 649 # ã¨ã©ã¼ï¼ä»®ã§ val[0] ãè¿ã628 # エラー:仮で val[0] を返す 650 629 result = val[0] 651 630 end 652 631 } 653 # mikan abstract_declarator ã pointer 以å¤ã§ã¯ãã¾ãåããªããã¨ãããã '*' CAST ã®ã¿æã£ã632 # mikan abstract_declarator が pointer 以外ではうまく動かない、とりあえず '*' CAST のみ救った 654 633 655 634 abstract_declarator # mikan … … 660 639 direct_abstract_declarator 661 640 : '(' abstract_declarator ')' 662 { result = val[1] } # é¢æ°ãã¤ã³ã¿åãæã641 { result = val[1] } # 関数ポインタ型を救う 663 642 | '[' ']' 664 643 { … … 699 678 } 700 679 701 # assignment_expression ãconstant_expressionã«å¤æ´680 # assignment_expressionをconstant_expressionに変更 702 681 initializer # mikan 703 682 : constant_expression … … 723 702 724 703 725 ########################## ããããã¯CDLç¬èª##########################726 727 # ãããã¬ãã«ã®æ§æè¦å728 # ã³ã³ãã¼ãã³ãè¨è¿°704 ########################## ここからはCDL独自 ########################## 705 706 #トップレベルの構文規則 707 #コンポーネント記述 729 708 component_description 730 709 : component_description specified_statement … … 738 717 obj = val[3] 739 718 if obj.kind_of?( Cell ) || obj.kind_of?( Signature ) || obj.kind_of?( Celltype ) || obj.kind_of?( CompositeCelltype )then 740 # cell, signature 以å¤ã¯ãæå®åãç½®ããªã719 # cell, signature 以外は、指定子を置けない 741 720 else 742 Generator.get_statement_specifier # ã¯ãªã¢721 Generator.get_statement_specifier # クリア 743 722 Generator.error( "G1009 unexpected specifier" ) 744 723 end 745 724 } 746 # ããã¨åãè¨è¿°ã composite_celltype ã«ããã725 # これと同じ記述が composite_celltype にもある 747 726 748 727 statement … … 760 739 | import_C 761 740 | signature_plugin 762 | error # ã¨ã©ã¼å復ãã¤ã³ã741 | error # エラー回復ポイント 763 742 764 743 … … 799 778 | IDENTIFIER '[' constant_expression ']' '.' IDENTIFIER '.' IDENTIFIER '=' initializer 800 779 { result = [ :NORMAL_ALLOC, val[0], val[2], val[5], val[7], val[9] ] } 801 # mikan å°æ¥çãªæ¡å¼µ ('*' ã§ã¾ã¨ãã¦æå®å¯è½ã¨ãã)780 # mikan 将来的な拡張 ('*' でまとめて指定可能とする) 802 781 # | IDENTIFIER '.' IDENTIFIER '.' '*' '=' initializer 803 782 # { result = [ val[0], val[ ], val[ ], val[ ] ] } … … 824 803 825 804 const_statement 826 : declaration # å®æ°å®ç¾©805 : declaration # 定数定義 827 806 { 828 807 val[0].each { |decl| … … 879 858 } 880 859 } 881 # mikan typedef_specifier æªå¦ç½®860 # mikan typedef_specifier 未処置 882 861 883 862 … … 899 878 : IDENTIFIER 900 879 {result = Namespace.new(val[0].val)} 901 # namespace ã¤ã³ã¹ã¿ã³ã¹ã« statement ãè¨æ¶ãããããããã§çæ880 # namespace インスタンスに statement を記憶させるためここで生成 902 881 903 882 statement_list … … 911 890 { result = val[0].append!( val[2].val ) } 912 891 913 # ã·ã°ããã£892 #シグニチャ 914 893 signature 915 894 : SIGNATURE signature_name '{' function_head_list '}' ';' … … 920 899 {result = Signature.new( val[0].val ) } 921 900 922 function_head_list # result: function_head ã®é 923 å 901 function_head_list # result: function_head の配列 924 902 # : function_head 925 903 # { result = NamedList.new( val[0], "function" ) } … … 938 916 val[1].check 939 917 else 940 # mikan é¢æ°ã®é 941 åã以ä¸ã®ã¡ãã»ã¼ã¸ã«ãªã 918 # mikan 関数の配列も以下のメッセージになる 942 919 Generator.error( "G1010 Not function" ) 943 920 result = nil … … 955 932 956 933 957 # ã»ã«ã¿ã¤ã934 #セルタイプ 958 935 celltype 959 936 : CELLTYPE celltype_name '{' celltype_statement_list '}' ';' … … 981 958 { 982 959 if val[3].kind_of? Port then 983 val[3].set_specifier val[1] # è¨å®é åºãã960 val[3].set_specifier val[1] # 設定順序あり 984 961 Celltype.new_port( val[3] ) 985 962 else 986 # Port 以å¤ã§ã¯æå®åã¯ã¨ã©ã¼963 # Port 以外では指定子はエラー 987 964 Generator.error( "G1012 $1 : cannot put specifier here" , val[1] ) 988 965 end … … 995 972 | require 996 973 | factory 997 # | error # ã¨ã©ã¼å復ãã¤ã³ã (#513 ç¡éã«ã¼ãã«é¥ãã±ã¼ã¹ãããã®ã§ãããã§ã®ã¨ã©ã¼å復ã¯åããã)974 # | error # エラー回復ポイント (#513 無限ループに陥るケースがあるので、ここでのエラー回復は取りやめ) 998 975 999 976 celltype_statement_specifier_list … … 1012 989 1013 990 alloc_list2 1014 : alloc2 { result = [ val[0] ] } # åãå£ã®ã¢ãã±ã¼ã¿æå® 1015 | alloc { result = [ val[0] ] } # å 1016 é¨ã»ã«ã®ã¢ãã±ã¼ã¿æå® 991 : alloc2 { result = [ val[0] ] } # 受け口のアロケータ指定 992 | alloc { result = [ val[0] ] } # 内部セルのアロケータ指定 1017 993 | alloc_list2 ',' alloc2 { result << val[2] } 1018 994 | alloc_list2 ',' alloc { result << val[2] } 1019 995 1020 996 alloc2 1021 : IDENTIFIER '.' IDENTIFIER '=' initializer # å 1022 é¨ã¢ãã±ã¼ã¿ (ãããã©åãã¢ãã±ã¼ã¿)æå® 997 : IDENTIFIER '.' IDENTIFIER '=' initializer # 内部アロケータ (デバドラ向きアロケータ)指定 1023 998 { result = [ :INTERNAL_ALLOC, val[0].val, val[2].val, val[4] ] } 1024 | IDENTIFIER '.' IDENTIFIER '<=' initializer # å¤æ®µãªã¬ã¼ã¢ãã«åãã¢ãã±ã¼ã¿æå®999 | IDENTIFIER '.' IDENTIFIER '<=' initializer # 多段リレーモデル向きアロケータ指定 1025 1000 { result = [ :RELAY_ALLOC, val[0].val, val[2].val, val[4] ] } 1026 1001 1027 1002 1028 # å¼ã³å£ãåãå£1003 #呼び口、受け口 1029 1004 port 1030 1005 : port_type namespace_signature_name port_name ';' … … 1052 1027 1053 1028 1054 # å±æ§1029 #属性 1055 1030 attribute 1056 1031 : ATTRIBUTE '{' attribute_declaration_list '}' ';' … … 1076 1051 { 1077 1052 val[3].each{ |i| # i:Decl 1078 i.set_kind( :ATTRIBUTE ) # è¨å®é åºãã1053 i.set_kind( :ATTRIBUTE ) # 設定順序あり 1079 1054 i.set_specifier_list( [val[1]] ) 1080 1055 i.check … … 1095 1070 : STRING_LITERAL 1096 1071 1097 #å 1098 é¨å¤æ° 1072 #内部変数 1099 1073 var 1100 1074 : VAR '{' var_declaration_list '}' ';' … … 1118 1092 { 1119 1093 val[3].each{ |i| # i:Decl 1120 i.set_kind( :VAR ) # è¨å®é åºãã1094 i.set_kind( :VAR ) # 設定順序あり 1121 1095 i.set_specifier_list( [val[1]] ) 1122 1096 i.check … … 1128 1102 : SIZE_IS '(' expression ')' { result = [:SIZE_IS,val[2]] } 1129 1103 1130 # ãªã¯ã¯ã¤ã¢1104 # リクワイア 1131 1105 require 1132 1106 : REQUIRE namespace_identifier '.' IDENTIFIER';' # mikan namespace #1 … … 1139 1113 } 1140 1114 1141 # ãã¡ã¯ããª1115 #ファクトリ 1142 1116 factory 1143 1117 : factory_head '{' factory_function_list '}' ';' … … 1148 1122 1149 1123 factory_function_list 1150 : # 空1124 : # 空 1151 1125 | factory_function_list factory_function 1152 1126 … … 1160 1134 : IDENTIFIER 1161 1135 1162 arg_list # factory ã® write é¢æ°ã®ç¬¬ä¸å¼æ°ä»¥é1136 arg_list # factory の write 関数の第三引数以降 1163 1137 : IDENTIFIER 1164 1138 { result = [ [ :IDENTIFIER, val[0].val ] ] } … … 1170 1144 { result << [ :STRING_LITERAL, val[2].val ] } 1171 1145 1172 # ã»ã«çæ1146 #セル生成 1173 1147 cell 1174 1148 : CELL namespace_celltype_name cell_name '{' … … 1176 1150 join_list '}' ';' 1177 1151 { result = Cell.end_of_parse true } 1178 | CELL namespace_celltype_name cell_name ';' # oyama ãããã¿ã¤ã宣è¨1152 | CELL namespace_celltype_name cell_name ';' # oyama プロトタイプ宣言 1179 1153 { result = Cell.end_of_parse false } 1180 1154 … … 1188 1162 1189 1163 join_list 1190 : # 空è¡0610071164 : # 空行 061007 1191 1165 | join_list specified_join 1192 1166 | join_list reverse_join … … 1231 1205 Cell.new_join( result, true ) 1232 1206 } 1233 | cae_name '=' initializer ';' # åæååï¼ '{', '}' ãå¯1207 | cae_name '=' initializer ';' # 初期化子: '{', '}' も可 1234 1208 { 1235 1209 result = Join.new( val[0].val, nil, val[2] ) … … 1275 1249 : constant_expression 1276 1250 1277 # è¤å種1251 #複合種 1278 1252 composite_celltype 1279 1253 : COMPOSITE composite_celltype_name '{' composite_celltype_statement_list '}' ';' … … 1295 1269 { 1296 1270 if val[0].kind_of?( Port ) then 1297 CompositeCelltype.new_port( val[0] ) # é 1298 延ãã¦ç»é² 1271 CompositeCelltype.new_port( val[0] ) # 遅延して登録 1299 1272 end 1300 1273 } … … 1302 1275 { 1303 1276 if val[3].kind_of?( Port ) then 1304 # port ä»¥å¤ val[3] ã«æå¹ãªå¤ãå 1305 ¥ã£ã¦ããªãã®ã§ã以ä¸ã®ã¡ã½ãããé©ç¨ã§ããªã 1306 # ç¾ç¶ port, cell 以å¤ã¯æå®åãåãä»ããªã 1307 # ï¼ãããå°æ¥ä»ã®æãæå®åãåãä»ããå¯è½æ§ãããã®ã§ããã®ä½ç½®ã«è¨è¿°ããï¼ 1277 # port 以外 val[3] に有効な値が入っていないので、以下のメソッドを適用できない 1278 # 現状 port, cell 以外は指定子を受け付けない 1279 # (しかし将来他の文も指定子を受け付ける可能性があるので、この位置に記述する) 1308 1280 val[3].set_specifier( Generator.get_statement_specifier ) 1309 CompositeCelltype.new_port( val[3] ) # é 1310 延ãã¦ç»é² (set_specifier å¾) 1281 CompositeCelltype.new_port( val[3] ) # 遅延して登録 (set_specifier 後) 1311 1282 elsif val[3].kind_of?( Cell ) then 1312 # Cell.end_of_parse ã«ã¦è¨å®1283 # Cell.end_of_parse にて設定 1313 1284 else 1314 Generator.get_statement_specifier # ã¯ãªã¢1285 Generator.get_statement_specifier # クリア 1315 1286 Generator.error( "G1013 unexpected specifier" ) 1316 1287 end … … 1322 1293 | internal_cell 1323 1294 | export_join 1324 # | error # ã¨ã©ã¼å復ãã¤ã³ã (#513 ç¡éã«ã¼ãã«é¥ãã±ã¼ã¹ãããã®ã§ãããã§ã®ã¨ã©ã¼å復ã¯åããã)1295 # | error # エラー回復ポイント (#513 無限ループに陥るケースがあるので、ここでのエラー回復は取りやめ) 1325 1296 1326 1297 composite_celltype_statement_specifier_list … … 1345 1316 } 1346 1317 1347 # å±æ§1318 #属性 1348 1319 composite_attribute 1349 1320 : ATTRIBUTE '{' composite_attribute_declaration_list '}' ';' … … 1376 1347 1377 1348 internal_join_list 1378 : # 空è¡0610071349 : # 空行 061007 1379 1350 | internal_join_list specified_join 1380 1351 | internal_join_list external_join 1381 1352 1382 external_join # cell å 1383 ã«è¨è¿°ããå¼ã³å£ã®å¤é¨çµå 1353 external_join # cell 内に記述する呼び口の外部結合 1384 1354 : internal_cell_elem_name '=>' COMPOSITE '.' export_name ';' 1385 1355 { Cell.external_join( val[0].val, val[4].val, true ) } 1386 1356 | internal_cell_elem_name '=>' export_name ';' 1387 1357 { Cell.external_join( val[0].val, val[2].val, false ) } 1388 # 以åã®ææ³ã§ã¯ãå¼ã³å£å´ã cell ã®å¤ã«è¨è¿°ãã¦ãã 1389 # ãã®æã®å®è£ 1390 ã 1391 1392 export_join # cell å¤ã«è¨è¿°ããåãå£ã®å¤é¨çµå 1358 # 以前の文法では、呼び口側も cell の外に記述していた 1359 # その時の実装を 1360 1361 export_join # cell 外に記述する受け口の外部結合 1393 1362 : export_name '=>' internal_ref_cell_name '.' internal_cell_elem_name ';' 1394 1363 { … … 1411 1380 : IDENTIFIER 1412 1381 1413 # ãªã¼ã¸ã§ã³1382 # リージョン 1414 1383 region 1415 1384 : spec_L region_specifier_list spec_R REGION region_name '{' region_statement '}' ';' … … 1426 1395 : IN_THROUGH '(' plugin_name ',' plugin_arg ')' 1427 1396 { Region.new_in_through( val[2].val, val[4].val ) } 1428 | IN_THROUGH '(' ')' # in 許å¯1397 | IN_THROUGH '(' ')' # in 許可 1429 1398 { Region.new_in_through } 1430 1399 | OUT_THROUGH '(' plugin_name ',' plugin_arg ')' 1431 1400 { Region.new_out_through( val[2].val, val[4].val ) } 1432 | OUT_THROUGH '(' ')' # out 許å¯1401 | OUT_THROUGH '(' ')' # out 許可 1433 1402 { Region.new_out_through() } 1434 1403 | TO_THROUGH '(' namespace_region_name ',' plugin_name ',' plugin_arg ')' 1435 1404 { Region.new_to_through( val[2], val[4].val, val[6].val ) } 1436 | TO_THROUGH '('namespace_region_name ')' # to 許å¯1405 | TO_THROUGH '('namespace_region_name ')' # to 許可 1437 1406 { Region.new_to_through( val[2], nil, nil ) } 1438 1407 | NODE … … 1461 1430 if obj.kind_of?( Cell ) then 1462 1431 else 1463 Generator.get_statement_specifier # ã¯ãªã¢1432 Generator.get_statement_specifier # クリア 1464 1433 Generator.error( "G9999 unexpected specifier" ) 1465 1434 end … … 1480 1449 namespace_region_name 1481 1450 : :IDENTIFIER 1482 { result = [ val[0].val ] } # mikan é 1483 åã§ããå¿ 1484 è¦ã¯ãªã 1451 { result = [ val[0].val ] } # mikan 配列である必要はない 1485 1452 # : namespace_identifier 1486 1453 1487 # æå®åã®æ¬å¼§ (in, out ãªã©ã®ãã¼ã¯ã¼ãåãæ¿ãã®ããåé¢)1454 # 指定子の括弧 (in, out などのキーワード切り替えのため分離) 1488 1455 spec_L 1489 1456 : '[' { set_in_specifier } … … 1620 1587 } 1621 1588 1622 # æå®å '[]' å 1623 ã§ã®ã¿ä½¿ç¨ã§ãããã¼ã¯ã¼ã 1589 # 指定子 '[]' 内でのみ使用できるキーワード 1624 1590 RESERVED2 = { 1625 1591 # specifier … … 1638 1604 # port (entry) 1639 1605 'inline' => :INLINE, 1640 'ref_desc' => :REF_DESC, # call ãå¯1606 'ref_desc' => :REF_DESC, # call も可 1641 1607 1642 1608 # port (call) … … 1682 1648 } 1683 1649 1684 # å帰çãªãã¼ãµã®ããã®ã¹ã¿ãã¯1650 # 再帰的なパーサのためのスタック 1685 1651 @@generator_nest = -1 1686 1652 @@generator_stack = [] 1687 1653 @@current_locale = [] 1688 1654 1689 # import_C ä¸ã§ãã1655 # import_C 中である 1690 1656 @@import_C = false 1691 1657 1692 # ãã¹ã¦ã®æ§æ解æãå®äºãã1658 # すべての構文解析が完了した 1693 1659 @@b_end_all_parse = false 1694 1660 1695 1661 def self.parse( file_name, plugin = nil, b_reuse = false ) 1696 # ãã¼ãµã¤ã³ã¹ã¿ã³ã¹ãçæ(å¥ãã¼ãµã§èªã¿è¾¼ã)1662 # パーサインスタンスを生成(別パーサで読み込む) 1697 1663 parser = Generator.new 1698 1664 1699 # plugin ãã import ããã¦ããå ´åã® plugin è¨å®1665 # plugin から import されている場合の plugin 設定 1700 1666 parser.set_plugin plugin 1701 1667 1702 # reuse ãã©ã°ãè¨å®1668 # reuse フラグを設定 1703 1669 parser.set_reuse b_reuse 1704 1670 1705 # cdl ããã¼ã¹1671 # cdl をパース 1706 1672 parser.parse( [file_name] ) 1707 1673 1708 # çµæåããã¼ãµã¹ã¿ãã¯ãæ»ã1674 # 終期化 パーサスタックを戻す 1709 1675 parser.finalize 1710 1676 end … … 1726 1692 def self.get_plugin 1727 1693 if @@generator_stack[@@generator_nest] then 1728 # tecsgen å¼æ°ã® cdl ã import ãããå ´åã¯nil1694 # tecsgen 引数の cdl が import される場合は nil 1729 1695 return @@generator_stack[@@generator_nest].get_plugin 1730 1696 else … … 1743 1709 def self.is_reuse? 1744 1710 if @@generator_stack[@@generator_nest] then 1745 # tecsgen å¼æ°ã® cdl ã import ãããå ´åã¯nil1711 # tecsgen 引数の cdl が import される場合は nil 1746 1712 return @@generator_stack[@@generator_nest].is_reuse? 1747 1713 else … … 1773 1739 b_in_string = false 1774 1740 1775 # euc ã®ã³ã¡ã³ãã utf8 ã¨ãã¦æ±ãã¨ãã³ã¡ã³ãã®çµããã誤ãåé¡ã®å¯¾ç1741 # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策 1776 1742 TECS_LANG::set_kcode_binary 1777 1743 … … 1783 1749 TECSIO.foreach(file) {|line| 1784 1750 col = 1 1785 # line.rstrip! æ¹è¡å«ãæååãæ±ãããã«ãªã£ãã®ã§ãããã§ç©ºç½ãåãé¤ããªããªã£ã1751 # line.rstrip! 改行含む文字列を扱うようになったので、ここで空白を取り除けなくなった 1786 1752 1787 1753 until line.empty? … … 1789 1755 if b_in_comment 1790 1756 case line 1791 # ã³ã¡ã³ãçµäº1757 # コメント終了 1792 1758 when /\A\*\// 1793 1759 b_in_comment = false 1794 1760 when /\A./ 1795 1761 ; 1796 when /\s+/ # line.rstrip! ãæ¢ãããã \n ãªã©ã®ç©ºç½æåã¨ã¾ã£ã¡ããã«ã¼ã«ãå¿ 1797 è¦ã«ãªã£ã 1762 when /\s+/ # line.rstrip! を止めたため \n などの空白文字とまっちするルールが必要になった 1798 1763 ; 1799 1764 end … … 1803 1768 @q << [:STRING_LITERAL, Token.new(string, file, lineno, col)] 1804 1769 b_in_string = false 1805 elsif line =~ /\A.*\\\n/ # æ¹è¡ \n 㯠'.' ã«ãããããªã1770 elsif line =~ /\A.*\\\n/ # 改行 \n は '.' にマッチしない 1806 1771 string += $& 1807 elsif line =~ /\A.*\n/ # æ¹è¡ \n 㯠'.' ã«ãããããªã1772 elsif line =~ /\A.*\n/ # 改行 \n は '.' にマッチしない 1808 1773 string += line 1809 # ãã®ä½ç½®ã§ã¯ error ã¡ã½ããã¯ä½¿ããªã (token èªåºãå)1774 # この位置では error メソッドは使えない (token 読出し前) 1810 1775 puts "error: #{file} line #{lineno}: string literal has newline without escape" 1811 1776 @@n_error += 1 … … 1813 1778 else 1814 1779 case line 1815 # 空ç½ãããªããã»ã¹ãã£ã¬ã¯ãã£ã1780 # 空白、プリプロセスディレクティブ 1816 1781 when /\A\s+/ 1817 1782 ; 1818 # èå¥å1783 # 識別子 1819 1784 when /\A[a-zA-Z_]\w*/ 1820 1785 word = $& 1821 1786 @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)] 1822 # 16 é²æ°å®æ°1787 # 16 進数定数 1823 1788 when /\A0x[0-9A-Fa-f]+/ 1824 1789 @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)] 1825 # 8 é²æ°å®æ°1790 # 8 進数定数 1826 1791 when /\A0[0-7]+/ 1827 1792 @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)] 1828 # æµ®åå°æ°å®æ°1793 # 浮動小数定数 1829 1794 when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/ 1830 1795 @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)] 1831 # æ´æ°å®æ°1796 # 整数定数 1832 1797 when /\A\d+/ 1833 1798 @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)] 1834 # æåå®æ°1799 # 文字定数 1835 1800 when /\A'(?:[^'\\]|\\.)'/ 1836 1801 @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)] 1837 # æåå1838 # "#include #include #include \"../systask/logtask.cfg\" æå¾ã® " å¿ã)ã§ç¡éã«ã¼ã1802 # 文字列 1803 # "#include #include #include \"../systask/logtask.cfg\" 最後の " 忘れ)で無限ループ 1839 1804 # when /\A"(?:[^"\\]+|\\.)*"/ 1840 when /\A"(?:[^"\\]|\\.)*"/ # ããã¯ãã¾ãè¡ãããã1805 when /\A"(?:[^"\\]|\\.)*"/ # これはうまく行くようだ 1841 1806 @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)] 1842 # æåå (æ¹è¡ãã)1807 # 文字列 (改行あり) 1843 1808 when /\A"(?:[^"\\]|\\.)*\\\n$/ 1844 1809 string = $& 1845 1810 b_in_string = true 1846 # æåå (æ¹è¡ãã, escape ãªã)1811 # 文字列 (改行あり, escape なし) 1847 1812 when /\A("(?:[^"\\]|\e\.)*)\n$/ 1848 1813 string = $1 + "\\\n" 1849 1814 b_in_string = true 1850 # ãã®ä½ç½®ã§ã¯ error ã¡ã½ããã¯ä½¿ããªã (token èªåºãå) # mikan cdl_error ã§ã¯ãªã1815 # この位置では error メソッドは使えない (token 読出し前) # mikan cdl_error ではない 1851 1816 puts "error: #{file} line #{lineno}: string literal has newline without escape" 1852 1817 @@n_error += 1 1853 # å±±æ¬å¼§ã§å²ã¾ããæåå1818 # 山括弧で囲まれた文字列 1854 1819 when /\A<[0-9A-Za-z_\. \/]+>/ # AB: angle bracke 1855 1820 @q << [:AB_STRING_LITERAL, Token.new($&, file, lineno, col)] 1856 # è¡ã³ã¡ã³ã1821 # 行コメント 1857 1822 when /\A\/\/.*$/ 1858 # èªã¿é£ã°ãã ã1859 # ã³ã¡ã³ãéå§1823 # 読み飛ばすだけ 1824 # コメント開始 1860 1825 when /\A\/\*/ 1861 1826 b_in_comment = true 1862 # '>>', '<<' ãªã©1827 # '>>', '<<' など 1863 1828 when /\A>>/, /\A<</, /\A==/, /\A!=/, /\A\&\&/, /\A\|\|/ 1864 1829 @q << [$&, Token.new($&, file, lineno, col)] 1865 1830 when /\A::/, /\A=>/, /\A<=/, /\A>=/ 1866 1831 @q << [$&, Token.new($&, file, lineno, col)] 1867 # '(', ')' ãªã©ä¸æåã®è¨å·ãã¾ãã¯æªç¥ã®è¨å·1832 # '(', ')' など一文字の記号、または未知の記号 1868 1833 when /\A./ 1869 1834 @q << [$&, Token.new($&, file, lineno, col)] … … 1889 1854 } 1890 1855 1891 # çµäºã®å°1856 # 終了の印 1892 1857 @q << nil 1893 1858 … … 1909 1874 1910 1875 if token[0] == :IDENTIFIER then 1911 # TYPE_NAME ãã¼ã¯ã³ã¸ç½®æã1876 # TYPE_NAME トークンへ置換え 1912 1877 if Namespace.is_typename?( token[1].val ) then 1913 1878 token[0] = :TYPE_NAME 1914 1879 elsif @in_specifier && RESERVED2[ token[1].val.to_s ] then 1915 # æå®åãã¼ã¯ã¼ãï¼ '[', ']' å 1916 ã§ã®ã¿æå¹) 1880 # 指定子キーワード( '[', ']' 内でのみ有効) 1917 1881 token[0] = RESERVED2[ token[1].val.to_s ] 1918 1882 end 1919 1883 end 1920 1884 1921 if $debug then # 070107 token ç¡å¹æãããéããªããããã (through å¯¾å¿ -d ã®æã«ä¾å¤çºç)1885 if $debug then # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生) 1922 1886 locale = @@current_locale[@@generator_nest] 1923 1887 if token then … … 1950 1914 @@n_warning = 0 1951 1915 1952 # ãã®ã¡ã½ããã¯æ§æ解æãæå³è§£æããã®ã¿å¼åºãå¯ï¼ã³ã¼ãçæã§ã¨ã©ã¼çºçã¯ä¸é©åï¼1916 # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切) 1953 1917 def self.error( msg, *arg ) 1954 1918 locale = nil … … 1960 1924 1961 1925 msg = TECSMsg.get_error_message( msg ) 1962 # $1, $2, ... ã arg ã§ç½®æ1926 # $1, $2, ... を arg で置換 1963 1927 count = 1 1964 1928 arg.each{ |a| … … 1968 1932 } 1969 1933 1970 # import_C ã®ä¸ã§ã®ã¨ã©ã¼ï¼1934 # import_C の中でのエラー? 1971 1935 if @@import_C then 1972 1936 C_parser.error( msg ) 1973 1937 else 1974 1938 1975 # Node ã®è¨æ¶ãã ä½ç½® (locale) ã使ç¨ããå ´åãå¤æ´ä»¥åã«æ¯ã¹ã1976 # åé¡çºçç®æã¨ç°ãªãä½ç½®ã«ã¨ã©ã¼ãåºããããæ§æ解æä¸ã®ã¨ã©ã¼1977 # ã¯ã解æä¸ã®ä½ç½®ãåºåããï¼(new_XXX 㧠owner ãåè¦ç´ ã®ãã§ã1978 # ã¯ããã㨠owner ã®è¡çªå·ãåºã¦ãã¾ãç¹ã§ããããçãã¦ãã)1939 # Node の記憶する 位置 (locale) を使用した場合、変更以前に比べ、 1940 # 問題発生箇所と異なる位置にエラーが出るため、構文解析中のエラー 1941 # は、解析中の位置を出力する.(new_XXX で owner が子要素のチェッ 1942 # クをすると owner の行番号が出てしまう点で、ずれが生じている) 1979 1943 1980 1944 if @@b_end_all_parse == false || locale == nil then … … 1989 1953 end 1990 1954 1991 # ãã®ã¡ã½ããã¯æ§æ解æãæå³è§£æããã®ã¿å¼åºãå¯ï¼ã³ã¼ãçæã§ã¦ã©ã¼ãã³ã°çºçã¯ä¸é©åï¼1955 # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切) 1992 1956 def self.warning( msg, *arg ) 1993 1957 locale = nil … … 1999 1963 2000 1964 msg = TECSMsg.get_warning_message( msg ) 2001 # $1, $2, ... ã arg ã§ç½®æ1965 # $1, $2, ... を arg で置換 2002 1966 count = 1 2003 1967 arg.each{ |a| … … 2007 1971 } 2008 1972 2009 # import_C ã®ä¸ã§ã®ã¦ã©ã¼ãã³ã°ï¼1973 # import_C の中でのウォーニング? 2010 1974 if @@import_C then 2011 1975 C_parser.warning( msg ) … … 2034 1998 end 2035 1999 2036 #=== '[' specifier å§ã2000 #=== '[' specifier 始め 2037 2001 def set_in_specifier 2038 2002 # p "set_in_specifier" … … 2040 2004 end 2041 2005 2042 #=== ']' specifier çµãã2006 #=== ']' specifier 終わり 2043 2007 def unset_in_specifier 2044 2008 # p "unset_in_specifier" … … 2046 2010 end 2047 2011 2048 # statement_specifier ã¯æ§æ解ééä¸ã§åç 2049 §ããããã 2012 # statement_specifier は構文解釈途中で参照したいため 2050 2013 @@statement_specifier_stack = [] 2051 2014 def self.add_statement_specifier( ss ) … … 2064 2027 end 2065 2028 2066 #=== ãã¹ã¦ã®æ§æ解æãå®äºãããã¨ãå ±å2029 #=== すべての構文解析が完了したことを報告 2067 2030 def self.end_all_parse 2068 2031 @@b_end_all_parse = true … … 2072 2035 2073 2036 2074 # ãã¡ã¤ã« => INCLUDE("header")ã®é 2075 å 2037 # ファイル => INCLUDE("header")の配列 2076 2038 Include = Hash.new {|hash, key| hash[key] = []} 2077 2039 … … 2127 2089 2128 2090 #= TECSIO 2129 # Ruby2.0(1.9) 対å¿ã«ä¼´ãå°å 2130 ¥ããã¯ã©ã¹ 2131 # SJIS 以å¤ã§ã¯ãASCII-8BIT ã¨ãã¦å 2132 ¥åãã 2091 # Ruby2.0(1.9) 対応に伴い導入したクラス 2092 # SJIS 以外では、ASCII-8BIT として入力する 2133 2093 class TECSIO 2134 def self.foreach(file) # ãããã¯å¼æ° { |line| } 2135 pr = Proc.new # ãã®ã¡ã½ããã®ãããã¯å¼æ°ã pr ã«ä»£å 2136 ¥ 2094 def self.foreach(file) # ブロック引数 { |line| } 2095 pr = Proc.new # このメソッドのブロック引数を pr に代入 2137 2096 if $b_no_kcode then 2138 2097 msg = "E".encode $Ruby19_File_Encode 2139 2098 if( $Ruby19_File_Encode == "Shift_JIS" ) 2140 2099 2141 # Shift JIS ã¯ããã£ãã Windows-31J ã¨ãã¦èªã¿è¾¼ã¾ããShift_JIS ã«å¤æãããï¼2142 # ã³ã¡ã³ãçã«å«ã¾ãã SJIS ã«ä¸é©åãªæåã³ã¼ã㯠'?' ã¾ã㯠REPLACEMENT CHARACTER ã«å¤æãããï¼2143 # EUC ã UTF-8 ã§è¨è¿°ããã CDL ãæ··å¨ãã¦ãã¦ããRuby ä¾å¤ãçºçãããã¨ãªãå¦çãé²ãããã¨ãã§ããï¼2144 # æåã³ã¼ãæå®ã SJIS ã§ãã£ã¦ãæååãªãã©ã«ã®ä¸ã«ãæåã³ã¼ããSJIS 以å¤ã®é ASCII ãå«ã¾ãã¦ããå ´åã2145 # Ruby 1.8 ã® tecsgen ã§ã¯æåã³ã¼ãæå®ã«å½±é¿ãªãå¦çããããã®ããRuby 1.9 以éã§ã¯ '?' ã«ç½®ãæããå¯è½æ§ãããï¼2100 # Shift JIS は、いったん Windows-31J として読み込ませ、Shift_JIS に変換させる. 2101 # コメント等に含まれる SJIS に不適切な文字コードは '?' または REPLACEMENT CHARACTER に変換される. 2102 # EUC や UTF-8 で記述された CDL が混在していても、Ruby 例外が発生することなく処理を進めることができる. 2103 # 文字コード指定が SJIS であって、文字列リテラルの中に、文字コードがSJIS 以外の非 ASCII が含まれている場合、 2104 # Ruby 1.8 の tecsgen では文字コード指定に影響なく処理されたものが、Ruby 1.9 以降では '?' に置き換わる可能性がある. 2146 2105 2147 2106 mode = "r:Windows-31J" … … 2167 2126 end 2168 2127 2169 #=== æåã³ã¼ããç¸éããå ´åä¸è´ããã2170 # msg 㨠str ã®æåã³ã¼ããç¸éããå ´åãstr ã msg ã®æåã³ã¼ãã«å¤æãã2171 # å¤æä¸å¯ã®æåã³ã¼ã㯠'?' (utf-8 ã®å ´å U+FFFD (REPLACEMENT CHARACTER )) ã«å¤æ2128 #=== 文字コードが相違する場合一致させる 2129 # msg と str の文字コードが相違する場合、str を msg の文字コードに変換する 2130 # 変換不可の文字コードは '?' (utf-8 の場合 U+FFFD (REPLACEMENT CHARACTER )) に変換 2172 2131 # 2173 # ãã®ã¡ã½ããã¯ãã¨ã©ã¼ã¡ãã»ã¼ã¸åºåã§ã使ç¨ããã¦ãããã¨ã«æ³¨æï¼2132 # このメソッドは、エラーメッセージ出力でも使用されていることに注意. 2174 2133 # 2175 2134 #msg_enc::Encode | String 2176 2135 def self.str_code_convert( msg, str ) 2177 2136 if $b_no_kcode == false then 2178 return str # Ruby V1.8 ã¾ã§2137 return str # Ruby V1.8 まで 2179 2138 end 2180 2139 if msg.encoding != str.encoding then 2181 option = { :invalid => :replace, :undef => :replace } # ä¾å¤ãçºçãããã'?' ã«å¤æãã(utf-8 ã¯0xfffd)2140 option = { :invalid => :replace, :undef => :replace } # 例外を発生させず、'?' に変換する(utf-8 は 0xfffd) 2182 2141 # return str.encode( msg.encoding, option ) 2183 2142 str = str.encode( "utf-8", option ) -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.