- 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/C_parser.y.rb
-
Property svn:mime-type
changed from
text/x-ruby
totext/x-ruby;charset=UTF-8
r270 r321 6 6 # Copyright (C) 2008-2014 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 : C_parser.y.rb 1011 2016-07-11 02:20:01Z coas-nagasima$37 # $Id$ 53 38 #++ 54 39 55 40 class C_parser 56 41 rule 57 # ãããã¬ãã«ã®æ§æè¦ç´ ã¯C_parser42 # トップレベルの構文要素は C_parser 58 43 all: C_parser 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 69 52 : namespace_identifier 70 53 { result = [ :IDENTIFIER, val[0] ] } #1ok 71 # : IDENTIFIER # mikan namespace ã¸ã®å¯¾å¿54 # : IDENTIFIER # mikan namespace への対応 72 55 # { result = [ :IDENTIFIER, val[0] ] } 73 56 # | TRUE … … 96 79 { result << val[1] } 97 80 98 # é¢æ°å¼ã³åºãã¨å¾ç½®ã¤ã³ã¯ãªã¡ã³ãããã¯ãªã¡ã³ãæ¼ç®åããªã81 # 関数呼び出しと後置インクリメント、デクリメント演算子がない 99 82 postfix_expression 100 83 : primary_expression … … 107 90 | postfix_expression '->' IDENTIFIER 108 91 { result = [ :OP_REF, val[0], val[2] ] } 109 | postfix_expression '++' { result = val[0] } # ++, -- ã¯ç¡è¦ãã92 | postfix_expression '++' { result = val[0] } # ++, -- は無視する 110 93 | postfix_expression '--' { result = val[0] } 111 94 … … 116 99 117 100 118 # åç½®ã¤ã³ã¯ãªã¡ã³ãããã¯ãªã¡ã³ãæ¼ç®åããªã101 # 前置インクリメント、デクリメント演算子がない 119 102 unary_expression 120 103 : postfix_expression … … 125 108 | SIZEOF '(' type_name ')' 126 109 { result = [ :OP_SIZEOF_TYPE, val[1] ] } 127 | '++' unary_expression { result = val[1] } # ++, -- ã¯ç¡è¦ãã110 | '++' unary_expression { result = val[1] } # ++, -- は無視する 128 111 | '--' unary_expression { result = val[1] } 129 112 … … 213 196 214 197 215 # ã³ã³ãæ¼ç®åã使ããªã198 # コンマ演算子が使えない 216 199 expression 217 200 : conditional_expression … … 238 221 239 222 # 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が指定できない、型が省略できない 245 228 declaration 246 229 : declaration_specifiers init_declarator_list ';' 247 230 # : type_specifier_qualifier_list init_declarator_list ';' 248 231 249 # declaration_specifiers ã¯é¢æ°ã®ãã©ã¡ã¼ã¿ã§ä½¿ããããã250 # type_specifier_qualifier_list ã§ååãããããªã232 # declaration_specifiersは関数のパラメータで使われるが、 233 # type_specifier_qualifier_listで十分かもしれない 251 234 252 235 declaration_specifiers 253 236 : storage_class 254 237 { 255 result = CIntType.new( -3 ) # storage class ã¯ç¡è¦238 result = CIntType.new( -3 ) # storage class は無視 256 239 } 257 240 | type_specifier … … 263 246 | storage_class declaration_specifiers 264 247 { 265 result = val[1] # storage class ã¯ç¡è¦248 result = val[1] # storage class は無視 266 249 } 267 250 | type_specifier declaration_specifiers … … 292 275 | DOUBLE { set_no_type_name true; result = CFloatType.new(-64) } 293 276 | 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 が宣言されたとする 297 280 | TYPE_NAME { set_no_type_name true; result = CDefinedType.new( val[0].val ) } 298 281 … … 314 297 } 315 298 316 # mikan K&R ã®struct_or_union_specifierã«ç¸å½ããããunionã¯ä½¿ããªã, bit field ã«ã対å¿ããªã299 # mikan K&Rのstruct_or_union_specifierに相当するが、unionは使えない, bit field にも対応しない 317 300 struct_specifier # mikan 318 301 : STRUCT struct_tag '{' … … 333 316 result = val[1] 334 317 } 335 | STRUCT struct_tag # mikan struct_tag 㯠namespace 対å¿ãå¿ 336 è¦ 318 | STRUCT struct_tag # mikan struct_tag は namespace 対応が必要 337 319 { 338 320 StructType.set_define( false ) … … 352 334 } 353 335 354 # ãã¤ã³ã¿ä¿®é£¾åã追å336 # ポインタ修飾子を追加 355 337 struct_declaration 356 338 : declaration_specifiers struct_declarator_list ';' … … 365 347 result = val[1] 366 348 } 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_を付けた 374 356 type_specifier_qualifier_list 375 357 : type_specifier … … 395 377 { result << val[2] } 396 378 397 # ããããã£ã¼ã«ãã¯ä½¿ããªã379 # ビットフィールドは使えない 398 380 struct_declarator 399 381 : declarator … … 404 386 : UNION union_tag '{' union_declaration_list '}' 405 387 | UNION '{' union_declaration_list '}' 406 | UNION union_tag # mikan struct_tag 㯠namespace 対å¿ãå¿ 407 è¦ 388 | UNION union_tag # mikan struct_tag は namespace 対応が必要 408 389 409 390 union_declaration_list … … 416 397 union_declaration 417 398 : declaration_specifiers union_declarator_list ';' 418 | union_specifier ';' # ç¡å419 | struct_specifier ';' # ç¡å399 | union_specifier ';' # 無名 400 | struct_specifier ';' # 無名 420 401 421 402 union_declarator_list … … 423 404 | union_declarator_list ',' union_declarator 424 405 425 # ããããã£ã¼ã«ãã¯ä½¿ããªã406 # ビットフィールドは使えない 426 407 union_declarator 427 408 : declarator … … 429 410 430 411 431 # enum ã®ç¨®é¡ã追å412 # enumの種類を追加 432 413 enum_specifier # mikan 433 414 : enum_type '{' enumerator_list '}' … … 462 443 } 463 444 | direct_declarator 464 | pointer TYPE_NAME # é¢æ°ãã¤ã³ã¿ã® typedef ãäºéå®ç¾©ã®å ´å445 | pointer TYPE_NAME # 関数ポインタの typedef が二重定義の場合 465 446 { 466 447 result = Decl.new( val[1].val ) … … 490 471 } 491 472 492 # | direct_declarator '(' identifier_list ')' # ããã¯ä½ã®ããã«å¿ 493 è¦ï¼ 060211 473 # | direct_declarator '(' identifier_list ')' # これは何のために必要? 060211 494 474 | direct_declarator '(' ')' 495 475 { … … 524 504 : parameter_list 525 505 | parameter_list ',' '.' '.' '.' 526 # mikan å¯å¤é·ãã©ã¡ã¼ã¿, ... ã®éã®ã¹ãã¼ã¹ã許ãããï¼ææãï¼506 # mikan 可変長パラメータ, ... の間のスペースが許される(手抜き) 527 507 528 508 parameter_list … … 532 512 # { 533 513 # val[0].add_param( val[2] ) 534 # # result = val[0] ä¸è¦514 # # result = val[0] 不要 535 515 # } 536 516 537 517 538 # ãã©ã¡ã¼ã¿ä¿®é£¾åã追å518 # パラメータ修飾子を追加 539 519 parameter_declaration 540 520 : declaration_specifiers declarator … … 545 525 # } 546 526 547 # 以ä¸ã¯ã¨ã©ã¼ã¨ãã548 # | declaration_specifiers # ä»®å¼æ°ãªãã¯ãã¨ããããæ±ããªã060210527 # 以下はエラーとする 528 # | declaration_specifiers # 仮引数なしは、とりあえず扱わない 060210 549 529 # { 550 530 # unless val[0].kind_of?( VoidType ) then … … 553 533 # result = nil 554 534 # } 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 不用になった 560 540 # : IDENTIFIER 561 541 # | identifier_list ',' IDENTIFIER … … 587 567 | direct_abstract_declarator '(' parameter_type_list ')' 588 568 589 # assignment_expression ãconstant_expressionã«å¤æ´569 # assignment_expressionをconstant_expressionに変更 590 570 initializer # mikan 591 571 : constant_expression … … 610 590 611 591 612 ########################## ããããã¯CDLç¬èª##########################613 614 # ãããã¬ãã«ã®æ§æè¦å592 ########################## ここからはCDL独自 ########################## 593 594 #トップレベルの構文規則 615 595 C_parser 616 596 : … … 628 608 | declaration 629 609 | ';' 630 | error # ã¨ã©ã¼å復ãã¤ã³ã610 | error # エラー回復ポイント 631 611 632 612 typedef … … 826 806 comment = false 827 807 828 # euc ã®ã³ã¡ã³ãã utf8 ã¨ãã¦æ±ãã¨ãã³ã¡ã³ãã®çµããã誤ãåé¡ã®å¯¾ç808 # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策 829 809 TECS_LANG::set_kcode_binary 830 810 831 # 800U, 0xffLL ãªã© (æ´æ°ãªãã©ã«ã«å 832 ±éã®ä¿®é£¾å) 811 # 800U, 0xffLL など (整数リテラルに共通の修飾子) 833 812 integer_qualifier = "([Uu][Ll][Ll]|[Uu][Ll]|[Uu]|[Ll][Ll]|[Ll])?" 834 813 … … 845 824 if comment 846 825 case line 847 # ã³ã¡ã³ãçµäº826 # コメント終了 848 827 when /\A\*\// 849 828 comment = false … … 853 832 else 854 833 case line 855 # 空ç½ãããªããã»ã¹ãã£ã¬ã¯ãã£ã834 # 空白、プリプロセスディレクティブ 856 835 when /\A\s+/ 857 836 ; 858 # èå¥å837 # 識別子 859 838 when /\A[a-zA-Z_]\w*/ 860 839 word = $& 861 840 @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)] 862 # 16 é²æ°å®æ°841 # 16 進数定数 863 842 when /\A0x[0-9A-Fa-f]+#{integer_qualifier}/ 864 843 @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)] 865 # 8 é²æ°å®æ°844 # 8 進数定数 866 845 when /\A0[0-7]+#{integer_qualifier}/ 867 846 @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)] 868 # æµ®åå°æ°å®æ°847 # 浮動小数定数 869 848 when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/ 870 849 @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)] 871 # æ´æ°å®æ°850 # 整数定数 872 851 when /\A\d+#{integer_qualifier}/ 873 852 # when /\A\d+/ 874 853 @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)] 875 # æå854 # 文字 876 855 when /\A'(?:[^'\\]|\\.)'/ 877 856 @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)] 878 # æåå879 # "#include #include #include \"../systask/logtask.cfg\" æå¾ã® " å¿ã)ã§ç¡éã«ã¼ã857 # 文字列 858 # "#include #include #include \"../systask/logtask.cfg\" 最後の " 忘れ)で無限ループ 880 859 # when /\A"(?:[^"\\]+|\\.)*"/ 881 when /\A"(?:[^"\\]|\\.)*"/ # ããã¯ãã¾ãè¡ãããã860 when /\A"(?:[^"\\]|\\.)*"/ # これはうまく行くようだ 882 861 @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)] 883 # è¡ã³ã¡ã³ã862 # 行コメント 884 863 when /\A\/\/.*$/ 885 # èªã¿é£ã°ãã ã886 # ã³ã¡ã³ãéå§864 # 読み飛ばすだけ 865 # コメント開始 887 866 when /\A\/\*/ 888 867 comment = true … … 913 892 } 914 893 915 # çµäºã®å°894 # 終了の印 916 895 @q << nil 917 896 … … 940 919 end 941 920 942 # TYPE_NAME ãã¼ã¯ã³ã¸ç½®ãæã921 # TYPE_NAME トークンへ置き換え 943 922 if @b_no_type_name == false 944 923 if token[0] == :IDENTIFIER && Namespace.is_typename?( token[1].val ) then … … 947 926 end 948 927 949 if $debug then # 070107 token ç¡å¹æãããéããªããããã (through å¯¾å¿ -d ã®æã«ä¾å¤çºç)928 if $debug then # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生) 950 929 locale = @@current_locale[@@generator_nest] 951 930 if token then … … 976 955 @@n_warning = 0 977 956 978 # ãã®ã¡ã½ããã¯æ§æ解æãæå³è§£æããã®ã¿å¼åºãå¯ï¼ã³ã¼ãçæã§ã¨ã©ã¼çºçã¯ä¸é©åï¼957 # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切) 979 958 def self.error( msg ) 980 959 @@n_error += 1 … … 988 967 end 989 968 990 # ãã®ã¡ã½ããã¯æ§æ解æãæå³è§£æããã®ã¿å¼åºãå¯ï¼ã³ã¼ãçæã§ã¦ã©ã¼ãã³ã°çºçã¯ä¸é©åï¼969 # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切) 991 970 def self.warning( msg ) 992 971 @@n_warning += 1 -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.