- Timestamp:
- May 22, 2019, 10:03:37 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/bnf.y.rb
-
Property svn:mime-type
changed from
text/x-ruby
totext/x-ruby;charset=UTF-8
r388 r389 6 6 # Copyright (C) 2008-2018 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 37 # $Id$ … … 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 '{' … … 397 378 | STRUCT 398 379 { 399 # tag ãç¡ãå ´åãå 400 é¨åãä¸ãã 380 # tag が無い場合、内部名を与える 401 381 result = StructType.new( :"TAG__#{@@no_struct_tag_num}__" ) 402 382 @@no_struct_tag_num += 1 … … 408 388 result = val[1] 409 389 } 410 | STRUCT struct_tag # mikan struct_tag 㯠namespace 対å¿ãå¿ 411 è¦ 390 | STRUCT struct_tag # mikan struct_tag は namespace 対応が必要 412 391 { 413 392 StructType.set_define( false ) … … 424 403 { result = StructType.new( val[0].val ) } 425 404 426 # ãã¤ã³ã¿ä¿®é£¾åã追å405 # ポインタ修飾子を追加 427 406 struct_declaration 428 407 : type_specifier_qualifier_list struct_declarator_list ';' … … 459 438 460 439 461 # K&R ã®specifier_qualifier_listã¨åã462 # ååãã¾ãããããã£ãã®ã§type_ãä»ãã440 # K&Rのspecifier_qualifier_listと同じ 441 # 名前がまぎらわしかったのでtype_を付けた 463 442 type_specifier_qualifier_list 464 # Oyama type_specifier ãç¹°ãè¿ãã¦æå®ãããã¨ã¯ãªããªã£ã (sign_int_type ã¨ããããï¼443 # Oyama type_specifier を繰り返して指定することはなくなった (sign_int_type としたため) 465 444 # : type_specifier type_specifier_qualifier_list 466 445 : type_specifier … … 470 449 result = val[1] 471 450 } 472 # mikan Oyama type_qualifier ã ãã§ã¯åæå®ã«ãªããªã : æ§æã¨ã©ã¼ã¨ãããããæå³ã¨ã©ã¼ã¨ããæ¹ã親å451 # mikan Oyama type_qualifier だけでは型指定にならない : 構文エラーとするより、意味エラーとした方が親切 473 452 # | type_qualifier 474 453 … … 480 459 { result << val[2] } 481 460 482 # ããããã£ã¼ã«ãã¯ä½¿ããªã461 # ビットフィールドは使えない 483 462 struct_declarator 484 463 : declarator 485 464 486 # enum ã®ç¨®é¡ã追å465 # enumの種類を追加 487 466 enum_specifier # mikan 488 467 : enum_type '{' enumerator_list '}' … … 538 517 result = val[0] 539 518 } 540 # | direct_declarator '(' identifier_list ')' # ããã¯ä½ã®ããã«å¿ 541 è¦ï¼ 060211 519 # | direct_declarator '(' identifier_list ')' # これは何のために必要? 060211 542 520 | direct_declarator '(' ')' 543 521 { … … 572 550 : parameter_list 573 551 | parameter_list ',' '...' 574 # mikan å¯å¤é·ãã©ã¡ã¼ã¿552 # mikan 可変長パラメータ 575 553 576 554 parameter_list … … 580 558 { 581 559 val[0].add_param( val[2] ) 582 # result = val[0] ä¸è¦583 } 584 585 586 # ãã©ã¡ã¼ã¿ä¿®é£¾åã追å560 # result = val[0] 不要 561 } 562 563 564 # パラメータ修飾子を追加 587 565 parameter_declaration 588 566 # : spec_L parameter_specifier_list spec_R declaration_specifiers declarator … … 595 573 } 596 574 597 # 以ä¸ã¯ã¨ã©ã¼ã¨ãã598 | declaration_specifiers declarator # parameter_specifier ãªãã¯æ±ããªã575 # 以下はエラーとする 576 | declaration_specifiers declarator # parameter_specifier なしは扱わない 599 577 { 600 578 Generator.error( "G1001 need specifier for \'$1\'" , val[1].get_name ) 601 579 result = nil 602 580 } 603 | declaration_specifiers # ä»®å¼æ°ãªãã¯ãã¨ããããæ±ããªã060210581 | declaration_specifiers # 仮引数なしは、とりあえず扱わない 060210 604 582 { 605 583 unless val[0].instance_of?( VoidType ) then … … 608 586 result = nil 609 587 } 610 # | '[' parameter_specifier_list ']' declaration_specifiers # å060210611 | parameter_specifier_list_bracket declaration_specifiers # å060210588 # | '[' parameter_specifier_list ']' declaration_specifiers # 同 060210 589 | parameter_specifier_list_bracket declaration_specifiers # 同 060210 612 590 { 613 591 unless val[1].instance_of?( VoidType ) then … … 650 628 result = val[1] 651 629 else 652 # ã¨ã©ã¼ï¼ä»®ã§ val[0] ãè¿ã630 # エラー:仮で val[0] を返す 653 631 result = val[0] 654 632 end 655 633 } 656 # mikan abstract_declarator ã pointer 以å¤ã§ã¯ãã¾ãåããªããã¨ãããã '*' CAST ã®ã¿æã£ã634 # mikan abstract_declarator が pointer 以外ではうまく動かない、とりあえず '*' CAST のみ救った 657 635 658 636 abstract_declarator # mikan … … 663 641 direct_abstract_declarator 664 642 : '(' abstract_declarator ')' 665 { result = val[1] } # é¢æ°ãã¤ã³ã¿åãæã643 { result = val[1] } # 関数ポインタ型を救う 666 644 | '[' ']' 667 645 { … … 702 680 } 703 681 704 # assignment_expression ãconstant_expressionã«å¤æ´682 # assignment_expressionをconstant_expressionに変更 705 683 initializer # mikan 706 684 : constant_expression … … 726 704 727 705 728 ########################## ããããã¯CDLç¬èª##########################729 730 # ãããã¬ãã«ã®æ§æè¦å731 # ã³ã³ãã¼ãã³ãè¨è¿°706 ########################## ここからはCDL独自 ########################## 707 708 #トップレベルの構文規則 709 #コンポーネント記述 732 710 component_description 733 711 : component_description specified_statement … … 742 720 obj = val[3] 743 721 if obj.kind_of?( Cell ) || obj.kind_of?( Signature ) || obj.kind_of?( Celltype ) || obj.kind_of?( CompositeCelltype )then 744 # cell, signature 以å¤ã¯ãæå®åãç½®ããªã722 # cell, signature 以外は、指定子を置けない 745 723 else 746 Generator.get_statement_specifier # ã¯ãªã¢724 Generator.get_statement_specifier # クリア 747 725 Generator.error( "G1009 unexpected specifier" ) 748 726 end 749 727 } 750 # ããã¨åãè¨è¿°ã composite_celltype ã«ããã728 # これと同じ記述が composite_celltype にもある 751 729 752 730 statement … … 764 742 | import_C 765 743 | generate_statement 766 | error # ã¨ã©ã¼å復ãã¤ã³ã744 | error # エラー回復ポイント 767 745 768 746 … … 803 781 | IDENTIFIER '[' constant_expression ']' '.' IDENTIFIER '.' IDENTIFIER '=' initializer 804 782 { result = [ :NORMAL_ALLOC, val[0], val[2], val[5], val[7], val[9] ] } 805 # mikan å°æ¥çãªæ¡å¼µ ('*' ã§ã¾ã¨ãã¦æå®å¯è½ã¨ãã)783 # mikan 将来的な拡張 ('*' でまとめて指定可能とする) 806 784 # | IDENTIFIER '.' IDENTIFIER '.' '*' '=' initializer 807 785 # { result = [ val[0], val[ ], val[ ], val[ ] ] } … … 828 806 829 807 const_statement 830 : declaration # å®æ°å®ç¾©808 : declaration # 定数定義 831 809 { 832 810 val[0].each { |decl| … … 883 861 } 884 862 } 885 # mikan typedef_specifier æªå¦ç½®863 # mikan typedef_specifier 未処置 886 864 887 865 … … 903 881 : IDENTIFIER 904 882 {result = Namespace.new(val[0].val)} 905 # namespace ã¤ã³ã¹ã¿ã³ã¹ã« statement ãè¨æ¶ãããããããã§çæ883 # namespace インスタンスに statement を記憶させるためここで生成 906 884 907 885 statement_list … … 915 893 { result = val[0].append!( val[2].val ) } 916 894 917 # ã·ã°ããã£895 #シグニチャ 918 896 signature 919 897 : SIGNATURE signature_name '{' function_head_list '}' ';' … … 924 902 {result = Signature.new( val[0].val ) } 925 903 926 function_head_list # result: function_head ã®é 927 å 904 function_head_list # result: function_head の配列 928 905 # : function_head 929 906 # { result = NamedList.new( val[0], "function" ) } … … 942 919 val[1].check 943 920 else 944 # mikan é¢æ°ã®é 945 åã以ä¸ã®ã¡ãã»ã¼ã¸ã«ãªã 921 # mikan 関数の配列も以下のメッセージになる 946 922 Generator.error( "G1010 Not function" ) 947 923 result = nil … … 959 935 960 936 961 # ã»ã«ã¿ã¤ã937 #セルタイプ 962 938 celltype 963 939 : CELLTYPE celltype_name '{' celltype_statement_list '}' ';' … … 985 961 { 986 962 if val[3].kind_of? Port then 987 val[3].set_specifier val[1] # è¨å®é åºãã963 val[3].set_specifier val[1] # 設定順序あり 988 964 Celltype.new_port( val[3] ) 989 965 else 990 # Port 以å¤ã§ã¯æå®åã¯ã¨ã©ã¼966 # Port 以外では指定子はエラー 991 967 Generator.error( "G1012 $1 : cannot put specifier here" , val[1] ) 992 968 end … … 999 975 | require 1000 976 | factory 1001 # | error # ã¨ã©ã¼å復ãã¤ã³ã (#513 ç¡éã«ã¼ãã«é¥ãã±ã¼ã¹ãããã®ã§ãããã§ã®ã¨ã©ã¼å復ã¯åããã)977 # | error # エラー回復ポイント (#513 無限ループに陥るケースがあるので、ここでのエラー回復は取りやめ) 1002 978 1003 979 celltype_statement_specifier_list … … 1016 992 1017 993 alloc_list2 1018 : alloc2 { result = [ val[0] ] } # åãå£ã®ã¢ãã±ã¼ã¿æå® 1019 | alloc { result = [ val[0] ] } # å 1020 é¨ã»ã«ã®ã¢ãã±ã¼ã¿æå® 994 : alloc2 { result = [ val[0] ] } # 受け口のアロケータ指定 995 | alloc { result = [ val[0] ] } # 内部セルのアロケータ指定 1021 996 | alloc_list2 ',' alloc2 { result << val[2] } 1022 997 | alloc_list2 ',' alloc { result << val[2] } 1023 998 1024 999 alloc2 1025 : IDENTIFIER '.' IDENTIFIER '=' initializer # å 1026 é¨ã¢ãã±ã¼ã¿ (ãããã©åãã¢ãã±ã¼ã¿)æå® 1000 : IDENTIFIER '.' IDENTIFIER '=' initializer # 内部アロケータ (デバドラ向きアロケータ)指定 1027 1001 { result = [ :INTERNAL_ALLOC, val[0].val, val[2].val, val[4] ] } 1028 | IDENTIFIER '.' IDENTIFIER '<=' initializer # å¤æ®µãªã¬ã¼ã¢ãã«åãã¢ãã±ã¼ã¿æå®1002 | IDENTIFIER '.' IDENTIFIER '<=' initializer # 多段リレーモデル向きアロケータ指定 1029 1003 { result = [ :RELAY_ALLOC, val[0].val, val[2].val, val[4] ] } 1030 1004 1031 1005 1032 # å¼ã³å£ãåãå£1006 #呼び口、受け口 1033 1007 port 1034 1008 : port_type namespace_signature_name port_name ';' … … 1056 1030 1057 1031 1058 # å±æ§1032 #属性 1059 1033 attribute 1060 1034 : ATTRIBUTE '{' attribute_declaration_list '}' ';' … … 1080 1054 { 1081 1055 val[3].each{ |i| # i:Decl 1082 i.set_kind( :ATTRIBUTE ) # è¨å®é åºãã1056 i.set_kind( :ATTRIBUTE ) # 設定順序あり 1083 1057 i.set_specifier_list( [val[1]] ) 1084 1058 i.check … … 1099 1073 : STRING_LITERAL 1100 1074 1101 #å 1102 é¨å¤æ° 1075 #内部変数 1103 1076 var 1104 1077 : VAR '{' var_declaration_list '}' ';' … … 1122 1095 { 1123 1096 val[3].each{ |i| # i:Decl 1124 i.set_kind( :VAR ) # è¨å®é åºãã1097 i.set_kind( :VAR ) # 設定順序あり 1125 1098 i.set_specifier_list( [val[1]] ) 1126 1099 i.check … … 1132 1105 : SIZE_IS '(' expression ')' { result = [:SIZE_IS,val[2]] } 1133 1106 1134 # ãªã¯ã¯ã¤ã¢1107 # リクワイア 1135 1108 require 1136 1109 : REQUIRE namespace_identifier '.' IDENTIFIER';' # mikan namespace #1 … … 1143 1116 } 1144 1117 1145 # ãã¡ã¯ããª1118 #ファクトリ 1146 1119 factory 1147 1120 : factory_head '{' factory_function_list '}' ';' … … 1152 1125 1153 1126 factory_function_list 1154 : # 空1127 : # 空 1155 1128 | factory_function_list factory_function 1156 1129 … … 1164 1137 : IDENTIFIER 1165 1138 1166 arg_list # factory ã® write é¢æ°ã®ç¬¬ä¸å¼æ°ä»¥é1139 arg_list # factory の write 関数の第三引数以降 1167 1140 : IDENTIFIER 1168 1141 { result = [ [ :IDENTIFIER, val[0].val ] ] } … … 1174 1147 { result << [ :STRING_LITERAL, val[2].val ] } 1175 1148 1176 # ã»ã«çæ1149 #セル生成 1177 1150 cell 1178 1151 : CELL namespace_celltype_name cell_name '{' … … 1180 1153 join_list '}' ';' 1181 1154 { result = Cell.end_of_parse true } 1182 | CELL namespace_celltype_name cell_name ';' # oyama ãããã¿ã¤ã宣è¨1155 | CELL namespace_celltype_name cell_name ';' # oyama プロトタイプ宣言 1183 1156 { result = Cell.end_of_parse false } 1184 1157 … … 1192 1165 1193 1166 join_list 1194 : # 空è¡0610071167 : # 空行 061007 1195 1168 | join_list specified_join 1196 1169 | join_list reverse_join … … 1235 1208 Cell.new_join( result, true ) 1236 1209 } 1237 | cae_name '=' initializer ';' # åæååï¼ '{', '}' ãå¯1210 | cae_name '=' initializer ';' # 初期化子: '{', '}' も可 1238 1211 { 1239 1212 result = Join.new( val[0].val, nil, val[2] ) … … 1279 1252 : constant_expression 1280 1253 1281 # è¤å種1254 #複合種 1282 1255 composite_celltype 1283 1256 : COMPOSITE composite_celltype_name '{' composite_celltype_statement_list '}' ';' … … 1299 1272 { 1300 1273 if val[0].kind_of?( Port ) then 1301 CompositeCelltype.new_port( val[0] ) # é 1302 延ãã¦ç»é² 1274 CompositeCelltype.new_port( val[0] ) # 遅延して登録 1303 1275 end 1304 1276 } … … 1306 1278 { 1307 1279 if val[3].kind_of?( Port ) then 1308 # port ä»¥å¤ val[3] ã«æå¹ãªå¤ãå 1309 ¥ã£ã¦ããªãã®ã§ã以ä¸ã®ã¡ã½ãããé©ç¨ã§ããªã 1310 # ç¾ç¶ port, cell 以å¤ã¯æå®åãåãä»ããªã 1311 # ï¼ãããå°æ¥ä»ã®æãæå®åãåãä»ããå¯è½æ§ãããã®ã§ããã®ä½ç½®ã«è¨è¿°ããï¼ 1280 # port 以外 val[3] に有効な値が入っていないので、以下のメソッドを適用できない 1281 # 現状 port, cell 以外は指定子を受け付けない 1282 # (しかし将来他の文も指定子を受け付ける可能性があるので、この位置に記述する) 1312 1283 val[3].set_specifier( Generator.get_statement_specifier ) 1313 CompositeCelltype.new_port( val[3] ) # é 1314 延ãã¦ç»é² (set_specifier å¾) 1284 CompositeCelltype.new_port( val[3] ) # 遅延して登録 (set_specifier 後) 1315 1285 elsif val[3].kind_of?( Cell ) then 1316 # Cell.end_of_parse ã«ã¦è¨å®1286 # Cell.end_of_parse にて設定 1317 1287 else 1318 Generator.get_statement_specifier # ã¯ãªã¢1288 Generator.get_statement_specifier # クリア 1319 1289 Generator.error( "G1013 unexpected specifier" ) 1320 1290 end … … 1326 1296 | internal_cell 1327 1297 | export_join 1328 # | error # ã¨ã©ã¼å復ãã¤ã³ã (#513 ç¡éã«ã¼ãã«é¥ãã±ã¼ã¹ãããã®ã§ãããã§ã®ã¨ã©ã¼å復ã¯åããã)1298 # | error # エラー回復ポイント (#513 無限ループに陥るケースがあるので、ここでのエラー回復は取りやめ) 1329 1299 1330 1300 composite_celltype_statement_specifier_list … … 1354 1324 } 1355 1325 1356 # å±æ§1326 #属性 1357 1327 composite_attribute 1358 1328 : ATTRIBUTE '{' composite_attribute_declaration_list '}' ';' … … 1385 1355 1386 1356 internal_join_list 1387 : # 空è¡0610071357 : # 空行 061007 1388 1358 | internal_join_list specified_join 1389 1359 | internal_join_list external_join 1390 1360 | internal_join_list reverse_join 1391 1361 1392 external_join # cell å 1393 ã«è¨è¿°ããå¼ã³å£ã®å¤é¨çµå 1362 external_join # cell 内に記述する呼び口の外部結合 1394 1363 : internal_cell_elem_name '=>' COMPOSITE '.' export_name ';' 1395 1364 { Cell.external_join( val[0].val, val[4].val, true ) } 1396 1365 | internal_cell_elem_name '=>' export_name ';' 1397 1366 { Cell.external_join( val[0].val, val[2].val, false ) } 1398 # 以åã®ææ³ã§ã¯ãå¼ã³å£å´ã cell ã®å¤ã«è¨è¿°ãã¦ãã 1399 # ãã®æã®å®è£ 1400 ã 1401 1402 export_join # cell å¤ã«è¨è¿°ããåãå£ã®å¤é¨çµå 1367 # 以前の文法では、呼び口側も cell の外に記述していた 1368 # その時の実装を 1369 1370 export_join # cell 外に記述する受け口の外部結合 1403 1371 : export_name '=>' internal_ref_cell_name '.' internal_cell_elem_name ';' 1404 1372 { … … 1421 1389 : IDENTIFIER 1422 1390 1423 # ãªã¼ã¸ã§ã³1391 # リージョン 1424 1392 region 1425 1393 : spec_L region_specifier_list spec_R REGION region_name '{' region_statement '}' ';' … … 1436 1404 : IN_THROUGH '(' plugin_name ',' plugin_arg ')' 1437 1405 { Region.new_in_through( val[2].val, val[4].val ) } 1438 | IN_THROUGH '(' ')' # in 許å¯1406 | IN_THROUGH '(' ')' # in 許可 1439 1407 { Region.new_in_through } 1440 1408 | OUT_THROUGH '(' plugin_name ',' plugin_arg ')' 1441 1409 { Region.new_out_through( val[2].val, val[4].val ) } 1442 | OUT_THROUGH '(' ')' # out 許å¯1410 | OUT_THROUGH '(' ')' # out 許可 1443 1411 { Region.new_out_through() } 1444 1412 | TO_THROUGH '(' namespace_region_name ',' plugin_name ',' plugin_arg ')' 1445 1413 { Region.new_to_through( val[2], val[4].val, val[6].val ) } 1446 | TO_THROUGH '('namespace_region_name ')' # to 許å¯1414 | TO_THROUGH '('namespace_region_name ')' # to 許可 1447 1415 { Region.new_to_through( val[2], nil, nil ) } 1448 1416 | NODE … … 1471 1439 if obj.kind_of?( Cell ) then 1472 1440 else 1473 Generator.get_statement_specifier # ã¯ãªã¢1441 Generator.get_statement_specifier # クリア 1474 1442 Generator.error( "G9999 unexpected specifier" ) 1475 1443 end … … 1490 1458 namespace_region_name 1491 1459 : :IDENTIFIER 1492 { result = [ val[0].val ] } # mikan é 1493 åã§ããå¿ 1494 è¦ã¯ãªã 1460 { result = [ val[0].val ] } # mikan 配列である必要はない 1495 1461 # : namespace_identifier 1496 1462 1497 # æå®åã®æ¬å¼§ (in, out ãªã©ã®ãã¼ã¯ã¼ãåãæ¿ãã®ããåé¢)1463 # 指定子の括弧 (in, out などのキーワード切り替えのため分離) 1498 1464 spec_L 1499 1465 : '[' { set_in_specifier } … … 1652 1618 } 1653 1619 1654 # æå®å '[]' å 1655 ã§ã®ã¿ä½¿ç¨ã§ãããã¼ã¯ã¼ã 1620 # 指定子 '[]' 内でのみ使用できるキーワード 1656 1621 RESERVED2 = { 1657 1622 # specifier … … 1670 1635 # port (entry) 1671 1636 'inline' => :INLINE, 1672 'ref_desc' => :REF_DESC, # call ãå¯1637 'ref_desc' => :REF_DESC, # call も可 1673 1638 1674 1639 # port (call) … … 1714 1679 } 1715 1680 1716 # å帰çãªãã¼ãµã®ããã®ã¹ã¿ãã¯1681 # 再帰的なパーサのためのスタック 1717 1682 @@generator_nest = -1 1718 1683 @@generator_stack = [] 1719 1684 @@current_locale = [] 1720 1685 1721 # import_C ä¸ã§ãã1686 # import_C 中である 1722 1687 @@import_C = false 1723 1688 1724 # ãã¹ã¦ã®æ§æ解æãå®äºãã1689 # すべての構文解析が完了した 1725 1690 @@b_end_all_parse = false 1726 1691 1727 # tag ãªãstruct1692 # tag なし struct 1728 1693 @@no_struct_tag_num = 0 1729 1694 1730 1695 def self.parse( file_name, plugin = nil, b_reuse = false ) 1731 # ãã¼ãµã¤ã³ã¹ã¿ã³ã¹ãçæ(å¥ãã¼ãµã§èªã¿è¾¼ã)1696 # パーサインスタンスを生成(別パーサで読み込む) 1732 1697 parser = Generator.new 1733 1698 1734 # plugin ãã import ããã¦ããå ´åã® plugin è¨å®1699 # plugin から import されている場合の plugin 設定 1735 1700 parser.set_plugin plugin 1736 1701 1737 # reuse ãã©ã°ãè¨å®1702 # reuse フラグを設定 1738 1703 parser.set_reuse b_reuse 1739 1704 1740 # cdl ããã¼ã¹1705 # cdl をパース 1741 1706 parser.parse( [file_name] ) 1742 1707 1743 # çµæåããã¼ãµã¹ã¿ãã¯ãæ»ã1708 # 終期化 パーサスタックを戻す 1744 1709 parser.finalize 1745 1710 end … … 1761 1726 def self.get_plugin 1762 1727 if @@generator_stack[@@generator_nest] then 1763 # tecsgen å¼æ°ã® cdl ã import ãããå ´åã¯nil1728 # tecsgen 引数の cdl が import される場合は nil 1764 1729 return @@generator_stack[@@generator_nest].get_plugin 1765 1730 else … … 1778 1743 def self.is_reuse? 1779 1744 if @@generator_stack[@@generator_nest] then 1780 # tecsgen å¼æ°ã® cdl ã import ãããå ´åã¯nil1745 # tecsgen 引数の cdl が import される場合は nil 1781 1746 return @@generator_stack[@@generator_nest].is_reuse? 1782 1747 else … … 1808 1773 b_in_string = false 1809 1774 1810 # euc ã®ã³ã¡ã³ãã utf8 ã¨ãã¦æ±ãã¨ãã³ã¡ã³ãã®çµããã誤ãåé¡ã®å¯¾ç1775 # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策 1811 1776 TECS_LANG::set_kcode_binary 1812 1777 … … 1818 1783 TECSIO.foreach(file) {|line| 1819 1784 col = 1 1820 # line.rstrip! æ¹è¡å«ãæååãæ±ãããã«ãªã£ãã®ã§ãããã§ç©ºç½ãåãé¤ããªããªã£ã1785 # line.rstrip! 改行含む文字列を扱うようになったので、ここで空白を取り除けなくなった 1821 1786 1822 1787 until line.empty? … … 1824 1789 if b_in_comment 1825 1790 case line 1826 # ã³ã¡ã³ãçµäº1791 # コメント終了 1827 1792 when /\A\*\// 1828 1793 b_in_comment = false 1829 1794 when /\A./ 1830 1795 ; 1831 when /\s+/ # line.rstrip! ãæ¢ãããã \n ãªã©ã®ç©ºç½æåã¨ã¾ã£ã¡ããã«ã¼ã«ãå¿ 1832 è¦ã«ãªã£ã 1796 when /\s+/ # line.rstrip! を止めたため \n などの空白文字とまっちするルールが必要になった 1833 1797 ; 1834 1798 end … … 1838 1802 @q << [:STRING_LITERAL, Token.new(string, file, lineno, col)] 1839 1803 b_in_string = false 1840 elsif line =~ /\A.*\\\n/ # æ¹è¡ \n 㯠'.' ã«ãããããªã1804 elsif line =~ /\A.*\\\n/ # 改行 \n は '.' にマッチしない 1841 1805 string += $& 1842 elsif line =~ /\A.*\n/ # æ¹è¡ \n 㯠'.' ã«ãããããªã1806 elsif line =~ /\A.*\n/ # 改行 \n は '.' にマッチしない 1843 1807 string += line 1844 # ãã®ä½ç½®ã§ã¯ error ã¡ã½ããã¯ä½¿ããªã (token èªåºãå)1808 # この位置では error メソッドは使えない (token 読出し前) 1845 1809 puts "#{file}:#{lineno}:#{col}: error: string literal has newline without escape" 1846 1810 @@n_error += 1 … … 1848 1812 else 1849 1813 case line 1850 # 空ç½ãããªããã»ã¹ãã£ã¬ã¯ãã£ã1814 # 空白、プリプロセスディレクティブ 1851 1815 when /\A\s+/ 1852 1816 ; 1853 # èå¥å1817 # 識別子 1854 1818 when /\A[a-zA-Z_]\w*/ 1855 1819 word = $& 1856 1820 @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)] 1857 # 16 é²æ°å®æ°1821 # 16 進数定数 1858 1822 when /\A0x[0-9A-Fa-f]+/ 1859 1823 @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)] 1860 # 8 é²æ°å®æ°1824 # 8 進数定数 1861 1825 when /\A0[0-7]+/ 1862 1826 @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)] 1863 # æµ®åå°æ°å®æ°1827 # 浮動小数定数 1864 1828 when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/ 1865 1829 @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)] 1866 # æ´æ°å®æ°1830 # 整数定数 1867 1831 when /\A\d+/ 1868 1832 @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)] 1869 # æåå®æ°1833 # 文字定数 1870 1834 when /\A'(?:[^'\\]|\\.)'/ 1871 1835 @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)] 1872 # æåå1873 # "#include #include #include \"../systask/logtask.cfg\" æå¾ã® " å¿ã)ã§ç¡éã«ã¼ã1836 # 文字列 1837 # "#include #include #include \"../systask/logtask.cfg\" 最後の " 忘れ)で無限ループ 1874 1838 # when /\A"(?:[^"\\]+|\\.)*"/ 1875 when /\A"(?:[^"\\]|\\.)*"/ # ããã¯ãã¾ãè¡ãããã1839 when /\A"(?:[^"\\]|\\.)*"/ # これはうまく行くようだ 1876 1840 @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)] 1877 # æåå (æ¹è¡ãã)1841 # 文字列 (改行あり) 1878 1842 when /\A"(?:[^"\\]|\\.)*\\\n$/ 1879 1843 string = $& 1880 1844 b_in_string = true 1881 # æåå (æ¹è¡ãã, escape ãªã)1845 # 文字列 (改行あり, escape なし) 1882 1846 when /\A("(?:[^"\\]|\e\.)*)\n$/ 1883 1847 string = $1 + "\\\n" 1884 1848 b_in_string = true 1885 # ãã®ä½ç½®ã§ã¯ error ã¡ã½ããã¯ä½¿ããªã (token èªåºãå) # mikan cdl_error ã§ã¯ãªã1849 # この位置では error メソッドは使えない (token 読出し前) # mikan cdl_error ではない 1886 1850 puts "#{file}:#{lineno}:#{col}: error: string literal has newline without escape" 1887 1851 @@n_error += 1 1888 # å±±æ¬å¼§ã§å²ã¾ããæåå1852 # 山括弧で囲まれた文字列 1889 1853 # when /\A<[0-9A-Za-z_\. \/]+>/ # AB: angle bracke 1890 when /\A<(?:[^>\\]|\\.)*>/ # ããã¯ãã¾ãè¡ãããã1854 when /\A<(?:[^>\\]|\\.)*>/ # これはうまく行くようだ 1891 1855 @q << [:AB_STRING_LITERAL, Token.new($&, file, lineno, col)] 1892 # è¡ã³ã¡ã³ã1856 # 行コメント 1893 1857 when /\A\/\/.*$/ 1894 # èªã¿é£ã°ãã ã1895 # ã³ã¡ã³ãéå§1858 # 読み飛ばすだけ 1859 # コメント開始 1896 1860 when /\A\/\*/ 1897 1861 b_in_comment = true 1898 # '>>', '<<' ãªã©1862 # '>>', '<<' など 1899 1863 when /\A>>/, /\A<</, /\A==/, /\A!=/, /\A\&\&/, /\A\|\|/ 1900 1864 @q << [$&, Token.new($&, file, lineno, col)] 1901 1865 when /\A::/, /\A=>/, /\A<=/, /\A>=/ 1902 1866 @q << [$&, Token.new($&, file, lineno, col)] 1903 # '(', ')' ãªã©ä¸æåã®è¨å·ãã¾ãã¯æªç¥ã®è¨å·1867 # '(', ')' など一文字の記号、または未知の記号 1904 1868 when /\A./ 1905 1869 @q << [$&, Token.new($&, file, lineno, col)] … … 1925 1889 } 1926 1890 1927 # çµäºã®å°1891 # 終了の印 1928 1892 @q << nil 1929 1893 … … 1945 1909 1946 1910 if token[0] == :IDENTIFIER then 1947 # TYPE_NAME ãã¼ã¯ã³ã¸ç½®æã1911 # TYPE_NAME トークンへ置換え 1948 1912 if Namespace.is_typename?( token[1].val ) then 1949 1913 token[0] = :TYPE_NAME 1950 1914 elsif @in_specifier && RESERVED2[ token[1].val.to_s ] then 1951 # æå®åãã¼ã¯ã¼ãï¼ '[', ']' å 1952 ã§ã®ã¿æå¹) 1915 # 指定子キーワード( '[', ']' 内でのみ有効) 1953 1916 token[0] = RESERVED2[ token[1].val.to_s ] 1954 1917 end 1955 1918 end 1956 1919 1957 if $debug then # 070107 token ç¡å¹æãããéããªããããã (through å¯¾å¿ -d ã®æã«ä¾å¤çºç)1920 if $debug then # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生) 1958 1921 locale = @@current_locale[@@generator_nest] 1959 1922 if token then … … 1987 1950 @@n_info = 0 1988 1951 1989 # ãã®ã¡ã½ããã¯æ§æ解æãæå³è§£æããã®ã¿å¼åºãå¯ï¼ã³ã¼ãçæã§ã¨ã©ã¼çºçã¯ä¸é©åï¼1952 # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切) 1990 1953 def self.error( msg, *arg ) 1991 1954 locale = nil … … 1997 1960 1998 1961 msg = TECSMsg.get_error_message( msg ) 1999 # $1, $2, ... ã arg ã§ç½®æ1962 # $1, $2, ... を arg で置換 2000 1963 count = 1 2001 1964 arg.each{ |a| … … 2005 1968 } 2006 1969 2007 # import_C ã®ä¸ã§ã®ã¨ã©ã¼ï¼1970 # import_C の中でのエラー? 2008 1971 if @@import_C then 2009 1972 C_parser.error( msg ) 2010 1973 else 2011 1974 2012 # Node ã®è¨æ¶ãã ä½ç½® (locale) ã使ç¨ããå ´åãå¤æ´ä»¥åã«æ¯ã¹ã2013 # åé¡çºçç®æã¨ç°ãªãä½ç½®ã«ã¨ã©ã¼ãåºããããæ§æ解æä¸ã®ã¨ã©ã¼2014 # ã¯ã解æä¸ã®ä½ç½®ãåºåããï¼(new_XXX 㧠owner ãåè¦ç´ ã®ãã§ã2015 # ã¯ããã㨠owner ã®è¡çªå·ãåºã¦ãã¾ãç¹ã§ããããçãã¦ãã)1975 # Node の記憶する 位置 (locale) を使用した場合、変更以前に比べ、 1976 # 問題発生箇所と異なる位置にエラーが出るため、構文解析中のエラー 1977 # は、解析中の位置を出力する.(new_XXX で owner が子要素のチェッ 1978 # クをすると owner の行番号が出てしまう点で、ずれが生じている) 2016 1979 2017 1980 if @@b_end_all_parse == false || locale == nil then … … 2026 1989 end 2027 1990 2028 # ãã®ã¡ã½ããã¯æ§æ解æãæå³è§£æããã®ã¿å¼åºãå¯ï¼ã³ã¼ãçæã§ã¦ã©ã¼ãã³ã°çºçã¯ä¸é©åï¼1991 # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切) 2029 1992 def self.warning( msg, *arg ) 2030 1993 locale = nil … … 2036 1999 2037 2000 msg = TECSMsg.get_warning_message( msg ) 2038 # $1, $2, ... ã arg ã§ç½®æ2001 # $1, $2, ... を arg で置換 2039 2002 count = 1 2040 2003 arg.each{ |a| … … 2044 2007 } 2045 2008 2046 # import_C ã®ä¸ã§ã®ã¦ã©ã¼ãã³ã°ï¼2009 # import_C の中でのウォーニング? 2047 2010 if @@import_C then 2048 2011 C_parser.warning( msg ) … … 2059 2022 end 2060 2023 2061 # ãã®ã¡ã½ããã¯æ§æ解æãæå³è§£æããã®ã¿å¼åºãå¯2024 # このメソッドは構文解析、意味解析からのみ呼出し可 2062 2025 def self.info( msg, *arg ) 2063 2026 locale = nil … … 2069 2032 2070 2033 msg = TECSMsg.get_info_message( msg ) 2071 # $1, $2, ... ã arg ã§ç½®æ2034 # $1, $2, ... を arg で置換 2072 2035 count = 1 2073 2036 arg.each{ |a| … … 2077 2040 } 2078 2041 2079 # import_C ã®ä¸ã§ã®ã¦ã©ã¼ãã³ã°ï¼2042 # import_C の中でのウォーニング? 2080 2043 if @@import_C then 2081 2044 C_parser.info( msg ) … … 2112 2075 end 2113 2076 2114 #=== '[' specifier å§ã2077 #=== '[' specifier 始め 2115 2078 def set_in_specifier 2116 2079 # p "set_in_specifier" … … 2118 2081 end 2119 2082 2120 #=== ']' specifier çµãã2083 #=== ']' specifier 終わり 2121 2084 def unset_in_specifier 2122 2085 # p "unset_in_specifier" … … 2124 2087 end 2125 2088 2126 # statement_specifier ã¯æ§æ解ééä¸ã§åç 2127 §ããããã 2089 # statement_specifier は構文解釈途中で参照したいため 2128 2090 @@statement_specifier_stack = [] 2129 2091 def self.add_statement_specifier( ss ) … … 2142 2104 end 2143 2105 2144 #=== ãã¹ã¦ã®æ§æ解æãå®äºãããã¨ãå ±å2106 #=== すべての構文解析が完了したことを報告 2145 2107 def self.end_all_parse 2146 2108 @@b_end_all_parse = true … … 2150 2112 2151 2113 2152 # ãã¡ã¤ã« => INCLUDE("header")ã®é 2153 å 2114 # ファイル => INCLUDE("header")の配列 2154 2115 Include = Hash.new {|hash, key| hash[key] = []} 2155 2116 … … 2205 2166 2206 2167 #= TECSIO 2207 # Ruby2.0(1.9) 対å¿ã«ä¼´ãå°å 2208 ¥ããã¯ã©ã¹ 2209 # SJIS 以å¤ã§ã¯ãASCII-8BIT ã¨ãã¦å 2210 ¥åãã 2168 # Ruby2.0(1.9) 対応に伴い導入したクラス 2169 # SJIS 以外では、ASCII-8BIT として入力する 2211 2170 class TECSIO 2212 def self.foreach(file) # ãããã¯å¼æ° { |line| } 2213 pr = Proc.new # ãã®ã¡ã½ããã®ãããã¯å¼æ°ã pr ã«ä»£å 2214 ¥ 2171 def self.foreach(file) # ブロック引数 { |line| } 2172 pr = Proc.new # このメソッドのブロック引数を pr に代入 2215 2173 if $b_no_kcode then 2216 2174 msg = "E".encode $Ruby19_File_Encode 2217 2175 if( $Ruby19_File_Encode == "Shift_JIS" ) 2218 2176 2219 # Shift JIS ã¯ããã£ãã Windows-31J ã¨ãã¦èªã¿è¾¼ã¾ããShift_JIS ã«å¤æãããï¼2220 # ã³ã¡ã³ãçã«å«ã¾ãã SJIS ã«ä¸é©åãªæåã³ã¼ã㯠'?' ã¾ã㯠REPLACEMENT CHARACTER ã«å¤æãããï¼2221 # EUC ã UTF-8 ã§è¨è¿°ããã CDL ãæ··å¨ãã¦ãã¦ããRuby ä¾å¤ãçºçãããã¨ãªãå¦çãé²ãããã¨ãã§ããï¼2222 # æåã³ã¼ãæå®ã SJIS ã§ãã£ã¦ãæååãªãã©ã«ã®ä¸ã«ãæåã³ã¼ããSJIS 以å¤ã®é ASCII ãå«ã¾ãã¦ããå ´åã2223 # Ruby 1.8 ã® tecsgen ã§ã¯æåã³ã¼ãæå®ã«å½±é¿ãªãå¦çããããã®ããRuby 1.9 以éã§ã¯ '?' ã«ç½®ãæããå¯è½æ§ãããï¼2177 # Shift JIS は、いったん Windows-31J として読み込ませ、Shift_JIS に変換させる. 2178 # コメント等に含まれる SJIS に不適切な文字コードは '?' または REPLACEMENT CHARACTER に変換される. 2179 # EUC や UTF-8 で記述された CDL が混在していても、Ruby 例外が発生することなく処理を進めることができる. 2180 # 文字コード指定が SJIS であって、文字列リテラルの中に、文字コードがSJIS 以外の非 ASCII が含まれている場合、 2181 # Ruby 1.8 の tecsgen では文字コード指定に影響なく処理されたものが、Ruby 1.9 以降では '?' に置き換わる可能性がある. 2224 2182 2225 2183 mode = "r:Windows-31J" … … 2245 2203 end 2246 2204 2247 #=== æåã³ã¼ããç¸éããå ´åä¸è´ããã2248 # msg 㨠str ã®æåã³ã¼ããç¸éããå ´åãstr ã msg ã®æåã³ã¼ãã«å¤æãã2249 # å¤æä¸å¯ã®æåã³ã¼ã㯠'?' (utf-8 ã®å ´å U+FFFD (REPLACEMENT CHARACTER )) ã«å¤æ2205 #=== 文字コードが相違する場合一致させる 2206 # msg と str の文字コードが相違する場合、str を msg の文字コードに変換する 2207 # 変換不可の文字コードは '?' (utf-8 の場合 U+FFFD (REPLACEMENT CHARACTER )) に変換 2250 2208 # 2251 # ãã®ã¡ã½ããã¯ãã¨ã©ã¼ã¡ãã»ã¼ã¸åºåã§ã使ç¨ããã¦ãããã¨ã«æ³¨æï¼2209 # このメソッドは、エラーメッセージ出力でも使用されていることに注意. 2252 2210 # 2253 2211 #msg_enc::Encode | String 2254 2212 def self.str_code_convert( msg, str ) 2255 2213 if $b_no_kcode == false then 2256 return str # Ruby V1.8 ã¾ã§2214 return str # Ruby V1.8 まで 2257 2215 end 2258 2216 if msg.encoding != str.encoding then 2259 option = { :invalid => :replace, :undef => :replace } # ä¾å¤ãçºçãããã'?' ã«å¤æãã(utf-8 ã¯0xfffd)2217 option = { :invalid => :replace, :undef => :replace } # 例外を発生させず、'?' に変換する(utf-8 は 0xfffd) 2260 2218 # return str.encode( msg.encoding, option ) 2261 2219 str = str.encode( "utf-8", option ) -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.