tecscde 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/.rubocop.yml +125 -0
- data/.rubocop_todo.yml +188 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +6 -0
- data/LICENSE +46 -0
- data/LICENSE.ja +32 -0
- data/README.ja.md +200 -0
- data/README.md +35 -0
- data/Rakefile +27 -0
- data/bin/tecscde +64 -0
- data/glade/tecscde-cell-property.glade +205 -0
- data/glade/tecscde-celltype-property.glade +172 -0
- data/glade/tecscde-celltype.glade +414 -0
- data/glade/tecscde-export.glade +161 -0
- data/glade/test-cell-plugin.rb +51 -0
- data/glade/test-cell-property.rb +35 -0
- data/glade/test-export.rb +35 -0
- data/glade/test-palette.rb +26 -0
- data/lib/tcflow.rb +148 -0
- data/lib/tecscde.rb +65 -0
- data/lib/tecscde/NewCell.png +0 -0
- data/lib/tecscde/SelectArrow.png +0 -0
- data/lib/tecscde/attr_tree_view.rb +253 -0
- data/lib/tecscde/cell_plugin_dialog.glade +294 -0
- data/lib/tecscde/cell_plugin_dialog.rb +89 -0
- data/lib/tecscde/celltype_tree_view.rb +105 -0
- data/lib/tecscde/change_set_control.rb +35 -0
- data/lib/tecscde/change_set_control/change_set.rb +32 -0
- data/lib/tecscde/change_set_control/change_set_manager.rb +62 -0
- data/lib/tecscde/command.rb +35 -0
- data/lib/tecscde/control.rb +491 -0
- data/lib/tecscde/highlighted_objects.rb +180 -0
- data/lib/tecscde/logger.rb +74 -0
- data/lib/tecscde/main_view_and_model.rb +80 -0
- data/lib/tecscde/palette.glade +553 -0
- data/lib/tecscde/palette.rb +174 -0
- data/lib/tecscde/preferences.glade +117 -0
- data/lib/tecscde/preferences.rb +44 -0
- data/lib/tecscde/tecs_model.rb +1137 -0
- data/lib/tecscde/tecs_model/hbar.rb +68 -0
- data/lib/tecscde/tecs_model/tm_c_port.rb +122 -0
- data/lib/tecscde/tecs_model/tm_c_port_array.rb +98 -0
- data/lib/tecscde/tecs_model/tm_cell.rb +496 -0
- data/lib/tecscde/tecs_model/tm_e_port.rb +126 -0
- data/lib/tecscde/tecs_model/tm_e_port_array.rb +78 -0
- data/lib/tecscde/tecs_model/tm_join.rb +293 -0
- data/lib/tecscde/tecs_model/tm_join_bar.rb +146 -0
- data/lib/tecscde/tecs_model/tm_port.rb +238 -0
- data/lib/tecscde/tecs_model/tm_port_array.rb +246 -0
- data/lib/tecscde/tecs_model/tm_region.rb +107 -0
- data/lib/tecscde/tecs_model/tm_uneditable.rb +68 -0
- data/lib/tecscde/tecs_model/vbar.rb +68 -0
- data/lib/tecscde/templates/_cell_info.cde.erb +15 -0
- data/lib/tecscde/templates/_join_info.cde.erb +28 -0
- data/lib/tecscde/templates/main.cde.erb +49 -0
- data/lib/tecscde/tm_object.rb +91 -0
- data/lib/tecscde/version.rb +4 -0
- data/lib/tecscde/view.rb +58 -0
- data/lib/tecscde/view/cairo_matrix.rb +90 -0
- data/lib/tecscde/view/canvas.rb +59 -0
- data/lib/tecscde/view/constants.rb +114 -0
- data/lib/tecscde/view/main_view.rb +1245 -0
- data/lib/tecsflow.rb +475 -0
- data/lib/tecsflow/C_parser.tab.rb +2471 -0
- data/lib/tecsflow/C_parser.y.rb +1087 -0
- data/lib/tecsflow/classes.rb +421 -0
- data/lib/tecsgen.rb +581 -0
- data/lib/tecsgen/core/C_parser.tab.rb +2477 -0
- data/lib/tecsgen/core/C_parser.y +1032 -0
- data/lib/tecsgen/core/bnf-deb.tab.rb +5193 -0
- data/lib/tecsgen/core/bnf.tab.rb +5193 -0
- data/lib/tecsgen/core/bnf.y +2211 -0
- data/lib/tecsgen/core/componentobj.rb +7901 -0
- data/lib/tecsgen/core/ctypes.rb +226 -0
- data/lib/tecsgen/core/expression.rb +1031 -0
- data/lib/tecsgen/core/gen_xml.rb +374 -0
- data/lib/tecsgen/core/generate.rb +5206 -0
- data/lib/tecsgen/core/location.rb +116 -0
- data/lib/tecsgen/core/messages.rb +101 -0
- data/lib/tecsgen/core/optimize.rb +456 -0
- data/lib/tecsgen/core/plugin.rb +332 -0
- data/lib/tecsgen/core/pluginModule.rb +165 -0
- data/lib/tecsgen/core/syntaxobj.rb +1234 -0
- data/lib/tecsgen/core/tecs_lang.rb +306 -0
- data/lib/tecsgen/core/tecsgen.rb +453 -0
- data/lib/tecsgen/core/tecsinfo.rb +860 -0
- data/lib/tecsgen/core/tool_info.rb +258 -0
- data/lib/tecsgen/core/types.rb +1632 -0
- data/lib/tecsgen/core/unjoin_plugin.rb +218 -0
- data/lib/tecsgen/core/value.rb +650 -0
- data/lib/tecsgen/messages/messages_console_en_US.rb +1171 -0
- data/lib/tecsgen/messages/messages_console_ja_JP.rb +1171 -0
- data/lib/tecsgen/messages/messages_file_en_US.rb +334 -0
- data/lib/tecsgen/messages/messages_file_ja_JP.rb +163 -0
- data/lib/tecsgen/plugin/ATK1AlarmPlugin.rb +196 -0
- data/lib/tecsgen/plugin/ATK1DelayTaskPlugin.rb +106 -0
- data/lib/tecsgen/plugin/ATK1EventPlugin.rb +147 -0
- data/lib/tecsgen/plugin/ATK1ISRPlugin.rb +174 -0
- data/lib/tecsgen/plugin/ATK1KernelPlugin.rb +287 -0
- data/lib/tecsgen/plugin/ATK1ResourcePlugin.rb +124 -0
- data/lib/tecsgen/plugin/ATK1TaskPlugin.rb +220 -0
- data/lib/tecsgen/plugin/C2TECSBridgePlugin.rb +210 -0
- data/lib/tecsgen/plugin/CellPlugin.rb +61 -0
- data/lib/tecsgen/plugin/CelltypePlugin.rb +72 -0
- data/lib/tecsgen/plugin/CompositePlugin.rb +66 -0
- data/lib/tecsgen/plugin/DomainPlugin.rb +89 -0
- data/lib/tecsgen/plugin/HRP2AlarmHandlerPlugin.rb +76 -0
- data/lib/tecsgen/plugin/HRP2Cache.rb +1 -0
- data/lib/tecsgen/plugin/HRP2CyclicHandlerPlugin.rb +75 -0
- data/lib/tecsgen/plugin/HRP2DataqueuePlugin.rb +68 -0
- data/lib/tecsgen/plugin/HRP2EventflagPlugin.rb +68 -0
- data/lib/tecsgen/plugin/HRP2FixedSizeMemoryPoolPlugin.rb +68 -0
- data/lib/tecsgen/plugin/HRP2HandlerPlugin.rb +117 -0
- data/lib/tecsgen/plugin/HRP2KernelObjectPlugin.rb +372 -0
- data/lib/tecsgen/plugin/HRP2ObjectPlugin.rb +94 -0
- data/lib/tecsgen/plugin/HRP2Plugin.rb +140 -0
- data/lib/tecsgen/plugin/HRP2PostHook.rb +111 -0
- data/lib/tecsgen/plugin/HRP2PriorityDataqueuePlugin.rb +66 -0
- data/lib/tecsgen/plugin/HRP2RPCPlugin.rb +319 -0
- data/lib/tecsgen/plugin/HRP2SVCPlugin.rb +473 -0
- data/lib/tecsgen/plugin/HRP2SemaphorePlugin.rb +67 -0
- data/lib/tecsgen/plugin/HRP2TaskPlugin.rb +200 -0
- data/lib/tecsgen/plugin/HRPHandlerPlugin.rb +125 -0
- data/lib/tecsgen/plugin/HRPKernelObjectManager.rb +72 -0
- data/lib/tecsgen/plugin/HRPKernelObjectPlugin.rb +333 -0
- data/lib/tecsgen/plugin/HRPObjectPlugin.rb +93 -0
- data/lib/tecsgen/plugin/HRPPlugin.rb +356 -0
- data/lib/tecsgen/plugin/HRPRPCPlugin.rb +407 -0
- data/lib/tecsgen/plugin/HRPSVCPlugin.rb +859 -0
- data/lib/tecsgen/plugin/HRPTaskPlugin.rb +107 -0
- data/lib/tecsgen/plugin/Mruby2CBridgePlugin.rb +86 -0
- data/lib/tecsgen/plugin/MrubyBridgeCellPlugin.rb +264 -0
- data/lib/tecsgen/plugin/MrubyBridgeCelltypePlugin.rb +293 -0
- data/lib/tecsgen/plugin/MrubyBridgeCompositePlugin.rb +49 -0
- data/lib/tecsgen/plugin/MrubyBridgePlugin.rb +67 -0
- data/lib/tecsgen/plugin/MrubyBridgeSignaturePlugin.rb +1307 -0
- data/lib/tecsgen/plugin/MrubyInfoBridgePlugin.rb +14 -0
- data/lib/tecsgen/plugin/MrubyInfoBridgeSignaturePlugin.rb +994 -0
- data/lib/tecsgen/plugin/MultiPlugin.rb +57 -0
- data/lib/tecsgen/plugin/NotifierPlugin.rb +1217 -0
- data/lib/tecsgen/plugin/OpaqueMarshalerPlugin.rb +81 -0
- data/lib/tecsgen/plugin/OpaqueRPCPlugin.rb +323 -0
- data/lib/tecsgen/plugin/RPCPlugin.rb +266 -0
- data/lib/tecsgen/plugin/RepeatCellPlugin.rb +166 -0
- data/lib/tecsgen/plugin/RepeatJoinPlugin.rb +130 -0
- data/lib/tecsgen/plugin/SharedOpaqueRPCPlugin.rb +357 -0
- data/lib/tecsgen/plugin/SharedRPCPlugin.rb +329 -0
- data/lib/tecsgen/plugin/SignaturePlugin.rb +77 -0
- data/lib/tecsgen/plugin/TECS2CBridgePlugin.rb +178 -0
- data/lib/tecsgen/plugin/TECSInfoPlugin.rb +280 -0
- data/lib/tecsgen/plugin/ThroughPlugin.rb +333 -0
- data/lib/tecsgen/plugin/TracePlugin.rb +484 -0
- data/lib/tecsgen/plugin/lib/GenHRP2Marshaler.rb +761 -0
- data/lib/tecsgen/plugin/lib/GenOpaqueMarshaler.rb +1107 -0
- data/lib/tecsgen/plugin/lib/GenParamCopy.rb +365 -0
- data/lib/tecsgen/plugin/lib/GenTransparentMarshaler.rb +683 -0
- data/lib/tecsgen/plugin/lib/MrubyBridgeCelltypePluginModule.rb +283 -0
- data/lib/tecsgen/plugin/lib/MrubyBridgeSignaturePluginModule.rb +277 -0
- data/lib/tecsgen/version.rb +6 -0
- data/samples/FigureSamples/active/active.cde +104 -0
- data/samples/FigureSamples/active/active.cdl +20 -0
- data/samples/FigureSamples/active/active.pdf +0 -0
- data/samples/FigureSamples/active/active.png +0 -0
- data/samples/FigureSamples/active/gen/tmp_C_src.c +36 -0
- data/samples/FigureSamples/active/gen/tmp_cygwin_tecs.h +1908 -0
- data/samples/FigureSamples/active/gen/tmp_plugin_post_code.cdl +0 -0
- data/samples/FigureSamples/allocator/allocator-internal.png +0 -0
- data/samples/FigureSamples/allocator/allocator.cde +171 -0
- data/samples/FigureSamples/allocator/allocator.cdl +58 -0
- data/samples/FigureSamples/allocator/allocator.png +0 -0
- data/samples/FigureSamples/basic/Makefile +87 -0
- data/samples/FigureSamples/basic/SimpleSample-trace.cdl +50 -0
- data/samples/FigureSamples/basic/SimpleSample.cde +91 -0
- data/samples/FigureSamples/basic/SimpleSample.cdl +47 -0
- data/samples/FigureSamples/basic/basic.cde +93 -0
- data/samples/FigureSamples/basic/basic.cdl +46 -0
- data/samples/FigureSamples/basic/basic.png +0 -0
- data/samples/FigureSamples/callback/callback.cde +130 -0
- data/samples/FigureSamples/callback/callback.cdl +29 -0
- data/samples/FigureSamples/callback/callback.png +0 -0
- data/samples/FigureSamples/carray/carray.cde +144 -0
- data/samples/FigureSamples/carray/carray.cdl +38 -0
- data/samples/FigureSamples/carray/carray.png +0 -0
- data/samples/FigureSamples/cearray/cearray.cde +314 -0
- data/samples/FigureSamples/cearray/cearray.cdl +60 -0
- data/samples/FigureSamples/cearray/cearray.png +0 -0
- data/samples/FigureSamples/composite/composite-internal.png +0 -0
- data/samples/FigureSamples/composite/composite.cde +216 -0
- data/samples/FigureSamples/composite/composite.cdl +95 -0
- data/samples/FigureSamples/composite/composite.png +0 -0
- data/samples/FigureSamples/earray/earray.cde +142 -0
- data/samples/FigureSamples/earray/earray.cdl +38 -0
- data/samples/FigureSamples/earray/earray.png +0 -0
- data/samples/FigureSamples/join/Makefile +87 -0
- data/samples/FigureSamples/join/join.cde +132 -0
- data/samples/FigureSamples/join/join.cdl +40 -0
- data/samples/FigureSamples/join/join.png +0 -0
- data/samples/FigureSamples/relay/Makefile +99 -0
- data/samples/FigureSamples/relay/relay-internal.png +0 -0
- data/samples/FigureSamples/relay/relay.cde +284 -0
- data/samples/FigureSamples/relay/relay.cdl +52 -0
- data/samples/FigureSamples/relay/relay.png +0 -0
- data/samples/FigureSamples/rpc/Makefile +123 -0
- data/samples/FigureSamples/rpc/rpc-expand.png +0 -0
- data/samples/FigureSamples/rpc/rpc.cde +245 -0
- data/samples/FigureSamples/rpc/rpc.png +0 -0
- data/samples/FigureSamples/rpc/rpc_sample.cdl +53 -0
- data/samples/SimpleSample/Makefile +25 -0
- data/samples/SimpleSample/SimpleSample/Makefile +86 -0
- data/samples/SimpleSample/SimpleSample/Makefile-trace +91 -0
- data/samples/SimpleSample/SimpleSample/README.txt +106 -0
- data/samples/SimpleSample/SimpleSample/SimpleSample-trace.cdl +50 -0
- data/samples/SimpleSample/SimpleSample/SimpleSample.cdl +45 -0
- data/samples/SimpleSample/SimpleSample/src/tSample.c +77 -0
- data/samples/SimpleSample/SimpleSample/src/tSimple.c +48 -0
- data/samples/SimpleSample/SimpleSample/src/tecs-types.h +27 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/Makefile +51 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/Makefile-trace +91 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/README.txt +106 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/SimpleSample-trace.cdl +80 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/SimpleSample.cdl +77 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/rSample/Makefile +112 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/rSimple/Makefile +109 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tSample.c +80 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tSimple.c +47 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tTaskMain.c +66 -0
- data/samples/SimpleSample/SimpleSampleOpaqueRPC/src/tecs-types.h +27 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/Makefile +125 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/Makefile-trace +130 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/SimpleSample-trace.cdl +54 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/SimpleSample.cdl +53 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/src/tSample.c +80 -0
- data/samples/SimpleSample/SimpleSampleTransparentRPC/src/tSimple.c +54 -0
- data/tecscde.gemspec +41 -0
- metadata +353 -0
|
@@ -0,0 +1,1087 @@
|
|
|
1
|
+
#
|
|
2
|
+
# TECS Generator
|
|
3
|
+
# Generator for TOPPERS Embedded Component System
|
|
4
|
+
#
|
|
5
|
+
# Copyright (C) 2008-2019 by TOPPERS Project
|
|
6
|
+
#--
|
|
7
|
+
# 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
|
|
8
|
+
# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
|
|
9
|
+
# 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
|
|
10
|
+
# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
|
|
11
|
+
# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
|
|
12
|
+
# スコード中に含まれていること.
|
|
13
|
+
# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
|
|
14
|
+
# 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
|
|
15
|
+
# 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
|
|
16
|
+
# の無保証規定を掲載すること.
|
|
17
|
+
# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
|
|
18
|
+
# 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
|
|
19
|
+
# と.
|
|
20
|
+
# (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
|
|
21
|
+
# 作権表示,この利用条件および下記の無保証規定を掲載すること.
|
|
22
|
+
# (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
|
|
23
|
+
# 報告すること.
|
|
24
|
+
# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
|
|
25
|
+
# 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
|
|
26
|
+
# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
|
|
27
|
+
# 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
|
|
28
|
+
# 免責すること.
|
|
29
|
+
#
|
|
30
|
+
# 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
|
|
31
|
+
# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
|
|
32
|
+
# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
|
|
33
|
+
# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
|
|
34
|
+
# の責任を負わない.
|
|
35
|
+
#
|
|
36
|
+
# $Id: C_parser.y.rb 3046 2019-02-13 13:44:43Z okuma-top $
|
|
37
|
+
#++
|
|
38
|
+
|
|
39
|
+
class TCFLOW_Cparser
|
|
40
|
+
rule
|
|
41
|
+
# トップレベルの構文要素は C_parser
|
|
42
|
+
all: C_parser
|
|
43
|
+
|
|
44
|
+
# Expr
|
|
45
|
+
########################## 式 ##########################
|
|
46
|
+
# K&Rの文法(プログラミング言語C 第2版 付録)に準拠しているが、C_Parser.y.rb から変形して作っている
|
|
47
|
+
|
|
48
|
+
primary_expression
|
|
49
|
+
: IDENTIFIER { result = val[0].val }
|
|
50
|
+
| INTEGER_CONSTANT { result = nil }
|
|
51
|
+
| FLOATING_CONSTANT { result = nil }
|
|
52
|
+
| OCTAL_CONSTANT { result = nil }
|
|
53
|
+
| HEX_CONSTANT { result = nil }
|
|
54
|
+
| CHARACTER_LITERAL { result = nil }
|
|
55
|
+
| string_literal_list { result = nil }
|
|
56
|
+
# | '(' expression ')' { result = val[1] } # 一度は postfix_expression として扱われている
|
|
57
|
+
# # これを扱わないと、ポインタを使った関数呼び出しが出ない
|
|
58
|
+
| '(' expression ')' { result = nil } # 一度は postfix_expression として扱われている
|
|
59
|
+
|
|
60
|
+
string_literal_list
|
|
61
|
+
: STRING_LITERAL
|
|
62
|
+
| string_literal_list STRING_LITERAL
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# 関数呼び出しと後置インクリメント、デクリメント演算子がない
|
|
66
|
+
postfix_expression
|
|
67
|
+
: primary_expression { result = val[0] }
|
|
68
|
+
# | primary_expression '(' argument_list ')'
|
|
69
|
+
| postfix_expression '(' argument_list ')' # postfix_expression 化した.func_ptr_array[]() が可能となる
|
|
70
|
+
{
|
|
71
|
+
####ここのvalにはセル内部変数は無い
|
|
72
|
+
if val[0]
|
|
73
|
+
if @current_function
|
|
74
|
+
@current_function.ref_func val[0].to_sym
|
|
75
|
+
end
|
|
76
|
+
result = "#{val[0]}()".to_sym
|
|
77
|
+
end
|
|
78
|
+
}
|
|
79
|
+
| postfix_expression '[' expression ']' { result = "#{val[0]}[]" }
|
|
80
|
+
| postfix_expression '.' IDENTIFIER { result = "#{val[0]}.#{val[2]}" }
|
|
81
|
+
| postfix_expression '->' IDENTIFIER { result = "#{val[0]}->#{val[2]}" }
|
|
82
|
+
| postfix_expression '++' { result = val[0] }
|
|
83
|
+
| postfix_expression '--' { result = val[0] }
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
argument_list
|
|
87
|
+
:
|
|
88
|
+
| assignment_expression
|
|
89
|
+
| argument_list ',' assignment_expression
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
# 前置インクリメント、デクリメント演算子がない
|
|
93
|
+
unary_expression
|
|
94
|
+
: postfix_expression
|
|
95
|
+
{
|
|
96
|
+
#p val[0] #######ここでglobal変数を持つ
|
|
97
|
+
if val[0]
|
|
98
|
+
if /\(\)$/ =~ val[0].to_s then
|
|
99
|
+
# () で終わっているものは関数として報告済み
|
|
100
|
+
else
|
|
101
|
+
if @current_function
|
|
102
|
+
@current_function.ref_var val[0].to_sym ###########
|
|
103
|
+
result = val[0].to_sym
|
|
104
|
+
#p result ####global_var
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
}
|
|
109
|
+
| '++' unary_expression { result = nil }
|
|
110
|
+
| '--' unary_expression { result = nil }
|
|
111
|
+
| unary_operator cast_expression { result = val[1] }
|
|
112
|
+
| SIZEOF unary_expression { result = nil }
|
|
113
|
+
| SIZEOF '(' type_name ')' { result = nil }
|
|
114
|
+
|
|
115
|
+
unary_operator
|
|
116
|
+
: '&'
|
|
117
|
+
| '*'
|
|
118
|
+
| '+'
|
|
119
|
+
| '-'
|
|
120
|
+
| '~'
|
|
121
|
+
| '!'
|
|
122
|
+
|
|
123
|
+
cast_expression
|
|
124
|
+
: unary_expression
|
|
125
|
+
| '(' type_name ')' cast_expression { result = val[3] }
|
|
126
|
+
|
|
127
|
+
multiplicative_expression
|
|
128
|
+
: cast_expression
|
|
129
|
+
| multiplicative_expression '*' cast_expression
|
|
130
|
+
| multiplicative_expression '/' cast_expression
|
|
131
|
+
| multiplicative_expression '%' cast_expression
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
additive_expression
|
|
135
|
+
: multiplicative_expression
|
|
136
|
+
| additive_expression '+' multiplicative_expression
|
|
137
|
+
| additive_expression '-' multiplicative_expression
|
|
138
|
+
|
|
139
|
+
shift_expression
|
|
140
|
+
: additive_expression
|
|
141
|
+
| shift_expression '<<' additive_expression
|
|
142
|
+
| shift_expression '>>' additive_expression
|
|
143
|
+
|
|
144
|
+
relational_expression
|
|
145
|
+
: shift_expression
|
|
146
|
+
| relational_expression '<' shift_expression
|
|
147
|
+
| relational_expression '>' shift_expression
|
|
148
|
+
| relational_expression '<=' shift_expression
|
|
149
|
+
| relational_expression '>=' shift_expression
|
|
150
|
+
|
|
151
|
+
equality_expression
|
|
152
|
+
: relational_expression
|
|
153
|
+
| equality_expression '==' relational_expression
|
|
154
|
+
| equality_expression '!=' relational_expression
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
and_expression
|
|
158
|
+
: equality_expression
|
|
159
|
+
| and_expression '&' equality_expression
|
|
160
|
+
|
|
161
|
+
exclusive_or_expression
|
|
162
|
+
: and_expression
|
|
163
|
+
| exclusive_or_expression '^' and_expression
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
inclusive_or_expression
|
|
167
|
+
: exclusive_or_expression
|
|
168
|
+
| inclusive_or_expression '|' exclusive_or_expression
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
logical_and_expression
|
|
172
|
+
: inclusive_or_expression
|
|
173
|
+
| logical_and_expression '&&' inclusive_or_expression
|
|
174
|
+
|
|
175
|
+
logical_or_expression
|
|
176
|
+
: logical_and_expression
|
|
177
|
+
| logical_or_expression '||' logical_and_expression
|
|
178
|
+
|
|
179
|
+
conditional_expression
|
|
180
|
+
: logical_or_expression
|
|
181
|
+
| logical_or_expression '?' expression ':' conditional_expression
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
# コンマ演算子が使えない
|
|
185
|
+
expression
|
|
186
|
+
: assignment_expression
|
|
187
|
+
| expression ',' assignment_expression
|
|
188
|
+
|
|
189
|
+
constant_expression
|
|
190
|
+
: conditional_expression
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
# Types
|
|
195
|
+
########################## 宣言 ##########################
|
|
196
|
+
|
|
197
|
+
##!
|
|
198
|
+
#declaration_list # declaration_list は compoundstatement からしか参照されないと仮定
|
|
199
|
+
# : declaration
|
|
200
|
+
# {
|
|
201
|
+
# if @current_function && val[0]
|
|
202
|
+
# val[0].each { |v|
|
|
203
|
+
# @current_function.new_local v
|
|
204
|
+
# }
|
|
205
|
+
# end
|
|
206
|
+
# }
|
|
207
|
+
# | declaration_list declaration
|
|
208
|
+
# {
|
|
209
|
+
# if @current_function && val[1]
|
|
210
|
+
# val[1].each { |v|
|
|
211
|
+
# @current_function.new_local v
|
|
212
|
+
# }
|
|
213
|
+
# end
|
|
214
|
+
# }
|
|
215
|
+
# | typedef # MS 拡張文法 関数内での typedef
|
|
216
|
+
# | declaration_list typedef
|
|
217
|
+
|
|
218
|
+
declaration
|
|
219
|
+
: declaration_specifiers init_declarator_list ';' { result = val[1] }
|
|
220
|
+
| declaration_specifiers ';' { result = nil }
|
|
221
|
+
|
|
222
|
+
declaration_specifiers
|
|
223
|
+
: storage_class
|
|
224
|
+
| type_specifier
|
|
225
|
+
| type_qualifier
|
|
226
|
+
| storage_class declaration_specifiers
|
|
227
|
+
| type_specifier declaration_specifiers
|
|
228
|
+
| type_qualifier declaration_specifiers
|
|
229
|
+
|
|
230
|
+
init_declarator_list
|
|
231
|
+
: init_declarator { result = [ val[0] ] }
|
|
232
|
+
| init_declarator_list ',' init_declarator
|
|
233
|
+
{
|
|
234
|
+
result << val[2]
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
init_declarator
|
|
238
|
+
: declarator { result = val[0] }
|
|
239
|
+
| declarator '=' initializer { result = val[0] }
|
|
240
|
+
|
|
241
|
+
type_specifier
|
|
242
|
+
: VOID { set_no_type_name true }
|
|
243
|
+
| FLOAT { set_no_type_name true }
|
|
244
|
+
| DOUBLE { set_no_type_name true }
|
|
245
|
+
| struct_or_union_specifier
|
|
246
|
+
| enum_specifier { set_no_type_name true }
|
|
247
|
+
| TYPE_NAME { set_no_type_name true }
|
|
248
|
+
| CHAR { set_no_type_name true }
|
|
249
|
+
| SHORT { set_no_type_name true }
|
|
250
|
+
| INT { set_no_type_name true }
|
|
251
|
+
| LONG { set_no_type_name true }
|
|
252
|
+
| SIGNED { set_no_type_name true }
|
|
253
|
+
| UNSIGNED { set_no_type_name true }
|
|
254
|
+
| __INT8 { set_no_type_name true }
|
|
255
|
+
| __INT16 { set_no_type_name true }
|
|
256
|
+
| __INT32 { set_no_type_name true }
|
|
257
|
+
| __INT64 { set_no_type_name true }
|
|
258
|
+
| __BOOL { set_no_type_name true }
|
|
259
|
+
|
|
260
|
+
struct_or_union_specifier
|
|
261
|
+
: struct_or_union
|
|
262
|
+
struct_tag '{' struct_declaration_list '}'
|
|
263
|
+
| struct_or_union '{' struct_declaration_list '}'
|
|
264
|
+
| struct_or_union '{' '}' # add 19.01.06 empty struct
|
|
265
|
+
| struct_or_union struct_tag '{' '}' # add 19.01.06 empty struct
|
|
266
|
+
| struct_or_union struct_tag
|
|
267
|
+
|
|
268
|
+
struct_or_union
|
|
269
|
+
: STRUCT { set_no_type_name true }
|
|
270
|
+
| UNION { set_no_type_name true }
|
|
271
|
+
|
|
272
|
+
struct_declaration_list
|
|
273
|
+
: struct_declaration
|
|
274
|
+
| struct_declaration_list struct_declaration
|
|
275
|
+
|
|
276
|
+
struct_tag:
|
|
277
|
+
IDENTIFIER
|
|
278
|
+
|
|
279
|
+
# ポインタ修飾子を追加
|
|
280
|
+
struct_declaration
|
|
281
|
+
: type_specifier_qualifier_list struct_declarator_list ';'
|
|
282
|
+
| type_specifier_qualifier_list ';' ##!
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
# K&Rのspecifier_qualifier_listと同じ
|
|
286
|
+
# 名前がまぎらわしかったのでtype_を付けた
|
|
287
|
+
type_specifier_qualifier_list
|
|
288
|
+
: type_specifier
|
|
289
|
+
| type_specifier type_specifier_qualifier_list
|
|
290
|
+
| type_qualifier
|
|
291
|
+
| type_qualifier type_specifier_qualifier_list
|
|
292
|
+
|
|
293
|
+
struct_declarator_list
|
|
294
|
+
: struct_declarator
|
|
295
|
+
| struct_declarator_list ',' struct_declarator
|
|
296
|
+
|
|
297
|
+
struct_declarator
|
|
298
|
+
: declarator
|
|
299
|
+
| declarator ':' constant_expression # bit フィールド
|
|
300
|
+
|
|
301
|
+
enum_specifier
|
|
302
|
+
: enum_type '{' enumerator_list '}'
|
|
303
|
+
| enum_type IDENTIFIER '{' enumerator_list '}'
|
|
304
|
+
| enum_type IDENTIFIER
|
|
305
|
+
|
|
306
|
+
enum_type
|
|
307
|
+
: ENUM
|
|
308
|
+
|
|
309
|
+
enumerator_list
|
|
310
|
+
: enumerator
|
|
311
|
+
| enumerator_list ',' enumerator
|
|
312
|
+
| enumerator_list ','
|
|
313
|
+
|
|
314
|
+
enumerator
|
|
315
|
+
: IDENTIFIER
|
|
316
|
+
| IDENTIFIER '=' constant_expression
|
|
317
|
+
|
|
318
|
+
type_qualifier
|
|
319
|
+
: CONST
|
|
320
|
+
| VOLATILE
|
|
321
|
+
|
|
322
|
+
declarator
|
|
323
|
+
: pointer direct_declarator { result = val[1] }
|
|
324
|
+
| direct_declarator { result = val[0] }
|
|
325
|
+
|
|
326
|
+
direct_declarator
|
|
327
|
+
: IDENTIFIER { result = val[0].val }
|
|
328
|
+
| '(' declarator ')' { result = val[1] }
|
|
329
|
+
| direct_declarator '[' constant_expression ']' { result = val[0] }
|
|
330
|
+
| direct_declarator '[' ']' { result = val[0] }
|
|
331
|
+
| direct_declarator '(' parameter_type_list ')' { result = val[0] }
|
|
332
|
+
| direct_declarator '(' identifier_list ')' { result = val[0] } # これは古い関数定義用
|
|
333
|
+
| direct_declarator '(' ')' { result = val[0] }
|
|
334
|
+
|
|
335
|
+
pointer
|
|
336
|
+
: pointer0
|
|
337
|
+
| call_convention pointer0 # 関数ポインタに __cdecl 等が付けられているケース
|
|
338
|
+
pointer0
|
|
339
|
+
: '*'
|
|
340
|
+
| '*' type_qualifier
|
|
341
|
+
| '*' pointer
|
|
342
|
+
| '*' type_qualifier pointer
|
|
343
|
+
| call_convention
|
|
344
|
+
|
|
345
|
+
call_convention
|
|
346
|
+
: __CDECL
|
|
347
|
+
| __STDCALL
|
|
348
|
+
| __FASTCALL
|
|
349
|
+
|
|
350
|
+
parameter_type_list
|
|
351
|
+
: parameter_list { TCFlow::Function.param_list val[0] }
|
|
352
|
+
| parameter_list '...' { TCFlow::Function.param_list val[0] }
|
|
353
|
+
| parameter_list ',' '...' { TCFlow::Function.param_list val[0] }
|
|
354
|
+
|
|
355
|
+
parameter_list
|
|
356
|
+
: parameter_declaration
|
|
357
|
+
{
|
|
358
|
+
if val[0]
|
|
359
|
+
result = [val[0]]
|
|
360
|
+
else
|
|
361
|
+
result = nil
|
|
362
|
+
end
|
|
363
|
+
}
|
|
364
|
+
| parameter_list ',' parameter_declaration
|
|
365
|
+
{
|
|
366
|
+
if val[0] && val[2]
|
|
367
|
+
result << val[2]
|
|
368
|
+
elsif val[2]
|
|
369
|
+
result = [ val[2] ] # これは文法エラー時しかありえない
|
|
370
|
+
end
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
# パラメータ修飾子を追加
|
|
375
|
+
parameter_declaration
|
|
376
|
+
: declaration_specifiers declarator
|
|
377
|
+
{ result = val[1] }
|
|
378
|
+
| declaration_specifiers abstract_declarator # 仮引数なし
|
|
379
|
+
{ result = nil }
|
|
380
|
+
| declaration_specifiers # 仮引数なし
|
|
381
|
+
{ result = nil }
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
identifier_list # 060211 不用になった
|
|
385
|
+
: IDENTIFIER
|
|
386
|
+
| identifier_list ',' IDENTIFIER
|
|
387
|
+
|
|
388
|
+
type_name
|
|
389
|
+
: type_specifier_qualifier_list
|
|
390
|
+
| type_specifier_qualifier_list abstract_declarator
|
|
391
|
+
|
|
392
|
+
abstract_declarator
|
|
393
|
+
: pointer
|
|
394
|
+
| direct_abstract_declarator
|
|
395
|
+
| pointer direct_abstract_declarator
|
|
396
|
+
|
|
397
|
+
direct_abstract_declarator
|
|
398
|
+
: '(' abstract_declarator ')'
|
|
399
|
+
| '[' ']'
|
|
400
|
+
| '[' constant_expression ']'
|
|
401
|
+
| direct_abstract_declarator '[' ']'
|
|
402
|
+
| direct_abstract_declarator '[' constant_expression ']'
|
|
403
|
+
| '(' ')'
|
|
404
|
+
| direct_abstract_declarator '(' ')'
|
|
405
|
+
| direct_abstract_declarator '(' parameter_type_list ')'
|
|
406
|
+
|
|
407
|
+
# assignment_expressionをconstant_expressionに変更
|
|
408
|
+
initializer # mikan
|
|
409
|
+
: constant_expression
|
|
410
|
+
| '{' initializer_list '}'
|
|
411
|
+
| '{' initializer_list ',' '}'
|
|
412
|
+
|
|
413
|
+
initializer_list
|
|
414
|
+
: initializer
|
|
415
|
+
| initializer_list ',' initializer
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
########################## ここからはCDL独自 ##########################
|
|
419
|
+
|
|
420
|
+
#トップレベルの構文規則
|
|
421
|
+
C_parser
|
|
422
|
+
: C_parser statement
|
|
423
|
+
|
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
statement
|
|
428
|
+
: typedef
|
|
429
|
+
| func_def
|
|
430
|
+
| declaration
|
|
431
|
+
| declarator ';' # 戻り値型指定のない関数を想定
|
|
432
|
+
| ';'
|
|
433
|
+
| error # エラー回復ポイント
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
typedef
|
|
437
|
+
: TYPEDEF type_specifier_qualifier_list declarator_list ';'
|
|
438
|
+
{
|
|
439
|
+
val[2].each{ |t|
|
|
440
|
+
# print( "typdef: #{t.to_s}\n" )
|
|
441
|
+
@type_name_list[ t.to_sym ] = t
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
| TYPEDEF type_specifier_qualifier_list ';' { error( "maybe typedef duplicate, ignored" ) }
|
|
445
|
+
# 二重定義の場合 無視
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
func_def
|
|
449
|
+
: declaration_specifiers declarator
|
|
450
|
+
{
|
|
451
|
+
@current_function = TCFlow::Function.new @@current_locale
|
|
452
|
+
}
|
|
453
|
+
kr_param_list compoundstatement
|
|
454
|
+
{
|
|
455
|
+
@current_function.set_name val[1]
|
|
456
|
+
#p val[1]
|
|
457
|
+
@current_function = nil
|
|
458
|
+
}
|
|
459
|
+
| declarator # 戻り値の型指定省略
|
|
460
|
+
{
|
|
461
|
+
@current_function = TCFlow::Function.new @@current_locale
|
|
462
|
+
}
|
|
463
|
+
kr_param_list compoundstatement
|
|
464
|
+
{
|
|
465
|
+
@current_function.set_name val[0]
|
|
466
|
+
#p val[0]
|
|
467
|
+
@current_function = nil
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
kr_param # 旧文法の引数
|
|
471
|
+
: type_specifier_qualifier_list declarator_list ';'
|
|
472
|
+
kr_param_list:
|
|
473
|
+
: kr_param_list kr_param
|
|
474
|
+
|
|
|
475
|
+
|
|
476
|
+
declarator_list
|
|
477
|
+
: declarator { result = [val[0]]}
|
|
478
|
+
| declarator_list ',' declarator { result << val[2] }
|
|
479
|
+
|
|
480
|
+
infunc_statement_list
|
|
481
|
+
: infunc_statement
|
|
482
|
+
| infunc_statement_list infunc_statement
|
|
483
|
+
|
|
484
|
+
infunc_statement
|
|
485
|
+
: ifstatement
|
|
486
|
+
| whilestatement
|
|
487
|
+
| dowhilestatement
|
|
488
|
+
| forstatement
|
|
489
|
+
| switchstatement
|
|
490
|
+
| labelstatement
|
|
491
|
+
| compoundstatement
|
|
492
|
+
| gotostatement
|
|
493
|
+
| expressionstatement
|
|
494
|
+
| declaration ##!
|
|
495
|
+
| asm_statement
|
|
496
|
+
| ';' # 空文
|
|
497
|
+
|
|
498
|
+
ifstatement
|
|
499
|
+
: IF '(' expression ')' infunc_statement
|
|
500
|
+
| IF '(' expression ')' infunc_statement ELSE infunc_statement
|
|
501
|
+
|
|
502
|
+
whilestatement
|
|
503
|
+
: WHILE '(' expression ')' infunc_statement
|
|
504
|
+
|
|
505
|
+
dowhilestatement
|
|
506
|
+
: DO infunc_statement WHILE '(' expression ')' ';'
|
|
507
|
+
|
|
508
|
+
forstatement
|
|
509
|
+
: FOR '(' expression_or_empty ';' expression_or_empty ';' expression_or_empty ')' infunc_statement
|
|
510
|
+
| FOR '(' declaration_specifiers init_declarator_list ';' expression_or_empty ';' expression_or_empty ')' infunc_statement
|
|
511
|
+
|
|
512
|
+
expression_or_empty
|
|
513
|
+
: expression
|
|
514
|
+
|
|
|
515
|
+
|
|
516
|
+
switchstatement
|
|
517
|
+
: SWITCH '(' expression ')' infunc_statement
|
|
518
|
+
|
|
519
|
+
labelstatement
|
|
520
|
+
: IDENTIFIER ':' infunc_statement
|
|
521
|
+
| CASE constant_expression ':' infunc_statement
|
|
522
|
+
| DEFAULT ':' infunc_statement
|
|
523
|
+
|
|
524
|
+
#追加部ここから ##!
|
|
525
|
+
#compoundstatement ::= '{' (declaration_list | infunc_statement_list)* '}'
|
|
526
|
+
compoundstatement
|
|
527
|
+
# : '{' declaration_list infunc_statement_list '}'
|
|
528
|
+
# | '{' declaration_list '}'
|
|
529
|
+
: '{' infunc_statement_list '}'
|
|
530
|
+
| '{' '}'
|
|
531
|
+
|
|
532
|
+
#追加部ここまで
|
|
533
|
+
|
|
534
|
+
gotostatement
|
|
535
|
+
: GOTO IDENTIFIER ';'
|
|
536
|
+
| CONTINUE ';'
|
|
537
|
+
| BREAK ';'
|
|
538
|
+
| RETURN ';'
|
|
539
|
+
| RETURN expression ';'
|
|
540
|
+
|
|
541
|
+
expressionstatement
|
|
542
|
+
: expression ';'
|
|
543
|
+
|
|
544
|
+
assignment_expression
|
|
545
|
+
: conditional_expression
|
|
546
|
+
| unary_expression assignment_operator assignment_expression
|
|
547
|
+
{
|
|
548
|
+
#p val[0] ###書き込みされる変数群
|
|
549
|
+
if val[0]
|
|
550
|
+
if /\(\)$/ =~ val[0].to_s then
|
|
551
|
+
# () で終わっているものは関数, 通常来ないはず
|
|
552
|
+
else
|
|
553
|
+
if @current_function
|
|
554
|
+
####p @current_function #### global_var選別後
|
|
555
|
+
@current_function.ref_var( val[0].to_sym, true ) ##### R/Wカウント
|
|
556
|
+
result = val[0].to_sym
|
|
557
|
+
end
|
|
558
|
+
end
|
|
559
|
+
end
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
assignment_operator
|
|
563
|
+
: '='
|
|
564
|
+
| '+='
|
|
565
|
+
| '-='
|
|
566
|
+
| '*='
|
|
567
|
+
| '/='
|
|
568
|
+
| '%='
|
|
569
|
+
| '<<='
|
|
570
|
+
| '>>='
|
|
571
|
+
| '&='
|
|
572
|
+
| '|='
|
|
573
|
+
| '^='
|
|
574
|
+
|
|
575
|
+
storage_class
|
|
576
|
+
: __INLINE__
|
|
577
|
+
| __FORCEINLINE
|
|
578
|
+
| INLINE
|
|
579
|
+
| EXTERN
|
|
580
|
+
| STATIC
|
|
581
|
+
| AUTO
|
|
582
|
+
| REGISTER
|
|
583
|
+
| __DECLSPEC '(' IDENTIFIER ')'
|
|
584
|
+
|
|
585
|
+
asm_statement
|
|
586
|
+
: _ASM {
|
|
587
|
+
while true
|
|
588
|
+
# ';' が表れるまで、トークンを読み飛ばす。
|
|
589
|
+
# gcc の構文拡張に対応すべきだが、単純な実装として、';' まで読み飛ばす。
|
|
590
|
+
# トークン単位で読み飛ばしているので、文字列やコメント内の ';' は対象にならない。
|
|
591
|
+
token = next_token
|
|
592
|
+
if token[1].val == ";"
|
|
593
|
+
break
|
|
594
|
+
end
|
|
595
|
+
# p "skip: #{token[1].val}"
|
|
596
|
+
end
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
end
|
|
600
|
+
|
|
601
|
+
---- inner
|
|
602
|
+
|
|
603
|
+
RESERVED = {
|
|
604
|
+
# keword
|
|
605
|
+
'typedef' => :TYPEDEF,
|
|
606
|
+
'struct' => :STRUCT,
|
|
607
|
+
'union' => :UNION,
|
|
608
|
+
|
|
609
|
+
# specifier
|
|
610
|
+
# types
|
|
611
|
+
'void' => :VOID,
|
|
612
|
+
'char' => :CHAR,
|
|
613
|
+
'short' => :SHORT,
|
|
614
|
+
|
|
615
|
+
'volatile'=> :VOLATILE,
|
|
616
|
+
'const' => :CONST,
|
|
617
|
+
'extern' => :EXTERN,
|
|
618
|
+
|
|
619
|
+
'long' => :LONG,
|
|
620
|
+
'float' => :FLOAT,
|
|
621
|
+
'double' => :DOUBLE,
|
|
622
|
+
'signed' => :SIGNED,
|
|
623
|
+
'unsigned'=> :UNSIGNED,
|
|
624
|
+
|
|
625
|
+
'int' => :INT,
|
|
626
|
+
'enum' => :ENUM,
|
|
627
|
+
'__int8' => :__INT8,
|
|
628
|
+
'__int16' => :__INT16,
|
|
629
|
+
'__int32' => :__INT32,
|
|
630
|
+
'__int64' => :__INT64,
|
|
631
|
+
'__bool' => :__BOOL,
|
|
632
|
+
|
|
633
|
+
'return' => :RETURN,
|
|
634
|
+
'if' => :IF,
|
|
635
|
+
'else' => :ELSE,
|
|
636
|
+
'while' => :WHILE,
|
|
637
|
+
'do' => :DO,
|
|
638
|
+
'for' => :FOR,
|
|
639
|
+
'case' => :CASE,
|
|
640
|
+
'default' => :DEFAULT,
|
|
641
|
+
'goto' => :GOTO,
|
|
642
|
+
'continue' => :CONTINUE,
|
|
643
|
+
'break' => :BREAK,
|
|
644
|
+
'static' => :STATIC,
|
|
645
|
+
'register' => :REGISTER,
|
|
646
|
+
'auto' => :AUTO,
|
|
647
|
+
'switch' => :SWITCH,
|
|
648
|
+
'sizeof' => :SIZEOF,
|
|
649
|
+
|
|
650
|
+
'__inline__' => :__INLINE__,
|
|
651
|
+
'__forceinline' => :__FORCEINLINE,
|
|
652
|
+
'inline' => :INLINE,
|
|
653
|
+
'__inline' => :INLINE,
|
|
654
|
+
|
|
655
|
+
'__declspec' => :__DECLSPEC,
|
|
656
|
+
'__cdecl' => :__CDECL,
|
|
657
|
+
'__stdcall' => :__STDCALL,
|
|
658
|
+
'__fastcall' => :__FASTCALL,
|
|
659
|
+
|
|
660
|
+
'__extension__' => :EXTENSION,
|
|
661
|
+
'__asm__' => :_ASM,
|
|
662
|
+
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
@@current_locale = []
|
|
666
|
+
|
|
667
|
+
def finalize
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
end
|
|
671
|
+
|
|
672
|
+
# GCC extension
|
|
673
|
+
@@header_lines =<<EOT
|
|
674
|
+
#ifndef TECS_NO_GCC_EXTENSION_SUPPORT
|
|
675
|
+
|
|
676
|
+
/*
|
|
677
|
+
* these extension can be eliminated also by spefcifying option
|
|
678
|
+
* --no-gcc-extension-support for tecsgen.
|
|
679
|
+
*/
|
|
680
|
+
#ifdef __GNUC__
|
|
681
|
+
|
|
682
|
+
#ifndef __attribute__
|
|
683
|
+
#define __attribute__(x)
|
|
684
|
+
#endif
|
|
685
|
+
|
|
686
|
+
#ifndef __extension__
|
|
687
|
+
#define __extension__
|
|
688
|
+
#endif
|
|
689
|
+
|
|
690
|
+
#ifndef __builtin_va_list
|
|
691
|
+
typedef char *__builtin_va_list;
|
|
692
|
+
// #define __builtin_va_list va_list
|
|
693
|
+
#endif
|
|
694
|
+
|
|
695
|
+
#ifndef restrict
|
|
696
|
+
#define restrict
|
|
697
|
+
#define __restrict
|
|
698
|
+
#endif
|
|
699
|
+
|
|
700
|
+
#define __asm__(x)
|
|
701
|
+
|
|
702
|
+
#define __builtin_offsetof( x, y ) (1)
|
|
703
|
+
|
|
704
|
+
#endif /* ifdef __GNUC__ */
|
|
705
|
+
#endif /* TECS_NO_GCC_EXTENSION_SUPPORT */
|
|
706
|
+
EOT
|
|
707
|
+
|
|
708
|
+
|
|
709
|
+
#===
|
|
710
|
+
#files::String ファイル名またはpipe コマンド
|
|
711
|
+
|
|
712
|
+
##parse
|
|
713
|
+
def parse(files, cpp_cmd)
|
|
714
|
+
|
|
715
|
+
#インスタンス変数
|
|
716
|
+
@current_function = nil
|
|
717
|
+
@type_name_list = {}
|
|
718
|
+
@b_no_type_name = false
|
|
719
|
+
@q = [ :EOF ]
|
|
720
|
+
@processing_file=nil
|
|
721
|
+
|
|
722
|
+
# integer_qualifier = "([Uu][Ll]?[Ll]?|[Ll][Ll]?[Uu]?)?" #これだとうまくいく(厳密でない)
|
|
723
|
+
# integer_qualifier = "([Uu][Ll][Ll]|[Uu][Ll]|[Uu]|[Ll][Ll][Uu]|[Ll][Uu]|[Ll][Ll]|[Ll])?" #これもうまくいく(厳密でない)
|
|
724
|
+
integer_qualifier = "([Uu](LL|ll|L|l)|(LL|ll|L|l)[Uu]?|[Uu])?"
|
|
725
|
+
|
|
726
|
+
#例外補足1
|
|
727
|
+
begin
|
|
728
|
+
comment = false
|
|
729
|
+
|
|
730
|
+
## 各ファイルに対する処理
|
|
731
|
+
file2_name = ""
|
|
732
|
+
files.each {|file|
|
|
733
|
+
|
|
734
|
+
if cpp_cmd then
|
|
735
|
+
file2_name = "#{$gen_dir}/tmp_#{file.sub(/.*\//,"")}"
|
|
736
|
+
File.open( file2_name, "w" ){
|
|
737
|
+
|f|
|
|
738
|
+
lines = IO.readlines( file )
|
|
739
|
+
f.puts( @@header_lines )
|
|
740
|
+
f.puts lines
|
|
741
|
+
}
|
|
742
|
+
end
|
|
743
|
+
@processing_file=file
|
|
744
|
+
STDERR.print "reading #{file}\n" #ファイルのパスを表示
|
|
745
|
+
lineno = 0
|
|
746
|
+
|
|
747
|
+
#例外補足2
|
|
748
|
+
begin #実行する処理
|
|
749
|
+
io = nil
|
|
750
|
+
if cpp_cmd
|
|
751
|
+
io = IO.popen( cpp_cmd + " " + file2_name, "r" ) #サブプロセスの標準入出力との間にパイプラインを確立
|
|
752
|
+
file3_name = "#{file2_name}_2.c"
|
|
753
|
+
file3 = File.open( file3_name, "w" )
|
|
754
|
+
else
|
|
755
|
+
io = File.open( file, "r" )
|
|
756
|
+
end
|
|
757
|
+
|
|
758
|
+
## ioに対する各処理
|
|
759
|
+
io.each {|line|
|
|
760
|
+
lineno += 1
|
|
761
|
+
if cpp_cmd then
|
|
762
|
+
file3.puts line
|
|
763
|
+
end
|
|
764
|
+
col = 1
|
|
765
|
+
line.rstrip! #末尾の空白文字を除去
|
|
766
|
+
|
|
767
|
+
until line.empty? ## untilの処理内容
|
|
768
|
+
|
|
769
|
+
if comment
|
|
770
|
+
case line
|
|
771
|
+
# コメント終了
|
|
772
|
+
when /\A\*\//
|
|
773
|
+
comment = false
|
|
774
|
+
when /\A./
|
|
775
|
+
;
|
|
776
|
+
end
|
|
777
|
+
# elsif asm_state != :NONE
|
|
778
|
+
# if asm_state == :WAIT_NEXT # __asm が来た直後
|
|
779
|
+
# case line
|
|
780
|
+
# # コメント開始
|
|
781
|
+
# when /\A\s*\{/
|
|
782
|
+
# asm_state = :WAIT_CB # 閉じ括弧待ち
|
|
783
|
+
# when /\As*/
|
|
784
|
+
# asm_state = :WAIT_SC # セミコロン待ち
|
|
785
|
+
# end
|
|
786
|
+
# elsif asm_state == :WAIT_CB # 閉じ括弧待ち
|
|
787
|
+
# case line
|
|
788
|
+
# when /\A.*\}/ # 本当は最短一致にすべきだろう
|
|
789
|
+
# # asm は特種で、通常ブロックが後続するケースはないので
|
|
790
|
+
# asm_state = :NONE
|
|
791
|
+
# when /\A.*/
|
|
792
|
+
# # asm_state = :WAIT_CB # 閉じ括弧待ちの継続
|
|
793
|
+
# end
|
|
794
|
+
# elsif asm_state == :WAIT_SC # セミコロン待ち
|
|
795
|
+
# case line
|
|
796
|
+
# when /\A.*;/
|
|
797
|
+
# asm_state = :NONE # 本当は最短一致にすべきだろう
|
|
798
|
+
# when /\A.*/
|
|
799
|
+
# # asm_state = :WAIT_SC # 閉じ括弧待ちの継続
|
|
800
|
+
# end
|
|
801
|
+
# end
|
|
802
|
+
else
|
|
803
|
+
case line
|
|
804
|
+
# 空白、プリプロセスディレクティブ
|
|
805
|
+
# when /\A#line\s+(\d+)\s+\"(.*)\"\.*$/ ####ここで行番号がうまく拾えない \d
|
|
806
|
+
when /\A#\s+(\d+)\s+\"(.*)\".*$/ #元のセルタイプコード中での行番号表示
|
|
807
|
+
# p "#{$1} #{$2}"
|
|
808
|
+
# lineno = __LINE__
|
|
809
|
+
lineno = $1.to_i - 1 # lineno
|
|
810
|
+
file = $2
|
|
811
|
+
# # プリプロセッサディレクティブ
|
|
812
|
+
when /\A#.*$/
|
|
813
|
+
# 読み飛ばすだけ
|
|
814
|
+
when /\A\s+/
|
|
815
|
+
;
|
|
816
|
+
# # __asm
|
|
817
|
+
# when /\A__asm/, /\A_asm/
|
|
818
|
+
# asm_state = :WAIT_NEXT
|
|
819
|
+
# 識別子
|
|
820
|
+
when /\A[a-zA-Z_]\w*/
|
|
821
|
+
word = $&
|
|
822
|
+
@q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)]
|
|
823
|
+
|
|
824
|
+
# 浮動小数定数
|
|
825
|
+
when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?([Ff]|[Ll])?/
|
|
826
|
+
@q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
|
|
827
|
+
when /\A\.[0-9]+([Ee][+-]?[0-9]+)?([Ff]|[Ll])?/ # . で始まる
|
|
828
|
+
@q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
|
|
829
|
+
when /\A[0-9]+[Ee][+-]?[0-9]+([Ff]|[Ll])?/ # . 以下がない
|
|
830
|
+
@q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
|
|
831
|
+
|
|
832
|
+
# 16 進数定数 ##! 大文字・小文字区別なし
|
|
833
|
+
when /\A0x[0-9A-Fa-f]+#{integer_qualifier}/
|
|
834
|
+
@q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)]
|
|
835
|
+
#when /\A0[Xx][0-9A-Fa-f]+(ULL?|ull?)/, /\A0[Xx][0-9A-Fa-f]+([UL]|[ul])/, /\A0[Xx][0-9A-Fa-f]+/
|
|
836
|
+
# 8 進数定数 ##! 大文字・小文字区別なし
|
|
837
|
+
when /\A0[0-7]+#{integer_qualifier}/
|
|
838
|
+
# when /\A0[0-7]+(UL|ul)/, /\A0[0-7]+([UL]|[ul])/, /\A0[0-7]+/
|
|
839
|
+
@q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)]
|
|
840
|
+
# 整数定数 ##! 大文字・小文字区別なし
|
|
841
|
+
when /\A\d+#{integer_qualifier}/
|
|
842
|
+
# when /\A\d+(UL|ul)/, /\A\d+([UL]|[ul])/, /\A\d+/
|
|
843
|
+
@q << [:INTEGER_CONSTANT, Token.new($&, file, lineno, col)]
|
|
844
|
+
# 文字
|
|
845
|
+
# when /\A'(?:[^'\\]|\\.)'/
|
|
846
|
+
when /\A'(?:[^'\\]|\\.){1,4}'/ # 1〜4文字まで可能とする
|
|
847
|
+
@q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)]
|
|
848
|
+
# 文字列
|
|
849
|
+
# "#include #include #include \"../systask/logtask.cfg\" # 最後の " 忘れ)で無限ループ
|
|
850
|
+
# when /\A"(?:[^"\\]+|\\.)*"/
|
|
851
|
+
when /\A"(?:[^"\\]|\\.)*"/ # これはうまく行くようだ
|
|
852
|
+
@q << [:STRING_LITERAL, Token.new($&, file, lineno, col)]
|
|
853
|
+
# 行コメント
|
|
854
|
+
when /\A\/\/.*$/
|
|
855
|
+
# # プリプロセッサディレクティブ(ファイル名)
|
|
856
|
+
when /\A\/\*/
|
|
857
|
+
comment = true
|
|
858
|
+
when /\A>>=/, /\A<<=/, /\A>>/, /\A<</, /\A\|\|/, /\A\&\&/, /\A\-\>/, /\A\+\+/, /\A\-\-/
|
|
859
|
+
@q << [$&, Token.new($&, file, lineno, col)]
|
|
860
|
+
when /\A\+=/, /\A\-=/, /\A\*=/, /\A\/=/, /\A%=/, /\A&=/, /\A\|=/, /\A\^=/, /\A\.\.\./
|
|
861
|
+
@q << [$&, Token.new($&, file, lineno, col)]
|
|
862
|
+
when /\A\::/, /\A==/, /\A!=/, /\A>=/, /\A<=/
|
|
863
|
+
@q << [$&, Token.new($&, file, lineno, col)]
|
|
864
|
+
when /\A./
|
|
865
|
+
@q << [$&, Token.new($&, file, lineno, col)]
|
|
866
|
+
else
|
|
867
|
+
raise
|
|
868
|
+
end
|
|
869
|
+
end
|
|
870
|
+
|
|
871
|
+
line = $'
|
|
872
|
+
col += $&.length
|
|
873
|
+
end ## untilの処理内容
|
|
874
|
+
|
|
875
|
+
} ## ioに対する各処理
|
|
876
|
+
@q << :EOF
|
|
877
|
+
rescue => evar #例外が発生した時の処理、例外の内容を受け取る→例外補足
|
|
878
|
+
error( evar )
|
|
879
|
+
# p $@
|
|
880
|
+
ensure #例外の発生有無にかかわらず最後に必ず実行する処理
|
|
881
|
+
if io
|
|
882
|
+
io.close
|
|
883
|
+
end
|
|
884
|
+
end
|
|
885
|
+
}## 各ファイルに対する処理
|
|
886
|
+
|
|
887
|
+
# 終了の印
|
|
888
|
+
@q << nil
|
|
889
|
+
|
|
890
|
+
@yydebug = true
|
|
891
|
+
do_parse
|
|
892
|
+
|
|
893
|
+
end
|
|
894
|
+
end ##parse
|
|
895
|
+
|
|
896
|
+
##next_token
|
|
897
|
+
def next_token
|
|
898
|
+
|
|
899
|
+
token = @q.shift
|
|
900
|
+
while token == :EOF # ファイルが空のとき :EOF が連続する
|
|
901
|
+
@type_name_list = {}
|
|
902
|
+
token = @q.shift
|
|
903
|
+
if token.instance_of? Array
|
|
904
|
+
#STDERR.print "parsing #{@processing_file}\n" #ファイルのパスを表示
|
|
905
|
+
end
|
|
906
|
+
end
|
|
907
|
+
|
|
908
|
+
if token then
|
|
909
|
+
@@current_locale = token[1].locale
|
|
910
|
+
|
|
911
|
+
case token[1].val
|
|
912
|
+
when ";", ":", ",", "(", ")", "{", "}"
|
|
913
|
+
set_no_type_name false
|
|
914
|
+
when ".", "->"
|
|
915
|
+
set_no_type_name true
|
|
916
|
+
end
|
|
917
|
+
|
|
918
|
+
|
|
919
|
+
# TYPE_NAME トークンへ置き換え
|
|
920
|
+
# print( "#{token[0]} : #{token[1]}\n" ) #トークン表示
|
|
921
|
+
if @b_no_type_name == false
|
|
922
|
+
if token[0] == :IDENTIFIER #形名、関数名、変数名
|
|
923
|
+
#p token[1].val ###ここに変数名は無い
|
|
924
|
+
#p @current_function ###ここの@global_varに変数格納済み(R/Wカウント済み)
|
|
925
|
+
if @current_function && @current_function.is_local_var?( token[1].val )
|
|
926
|
+
# local 変数または引数
|
|
927
|
+
else
|
|
928
|
+
if @type_name_list[ token[1].val ] then
|
|
929
|
+
#print ("#{token[1]}\n")
|
|
930
|
+
token[0] = :TYPE_NAME
|
|
931
|
+
end
|
|
932
|
+
end
|
|
933
|
+
end
|
|
934
|
+
end
|
|
935
|
+
|
|
936
|
+
#$debug = true ####
|
|
937
|
+
if $b_print_all_token then # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
|
|
938
|
+
locale = @@current_locale
|
|
939
|
+
if token then
|
|
940
|
+
print( "#{locale[0]}: line #{locale[1]} : #{token[0]} : '#{token[1].val}'\n" )
|
|
941
|
+
else
|
|
942
|
+
print( "#{locale[0]}: line #{locale[1]} : EOF\n" )
|
|
943
|
+
end
|
|
944
|
+
end
|
|
945
|
+
end
|
|
946
|
+
|
|
947
|
+
token
|
|
948
|
+
end ##next_token
|
|
949
|
+
|
|
950
|
+
##on_error
|
|
951
|
+
def on_error(t, v, vstack)
|
|
952
|
+
if v == "$" then
|
|
953
|
+
error( "Unexpected EOF" )
|
|
954
|
+
else
|
|
955
|
+
error( "syntax error near '#{v.val}'" )
|
|
956
|
+
end
|
|
957
|
+
|
|
958
|
+
end ##on_error
|
|
959
|
+
|
|
960
|
+
def self.current_locale
|
|
961
|
+
@@current_locale
|
|
962
|
+
end
|
|
963
|
+
|
|
964
|
+
@@n_error = 0
|
|
965
|
+
@@n_warning = 0
|
|
966
|
+
|
|
967
|
+
##error
|
|
968
|
+
# このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
|
|
969
|
+
def error( msg )
|
|
970
|
+
@@n_error += 1
|
|
971
|
+
locale = @@current_locale
|
|
972
|
+
|
|
973
|
+
if locale then
|
|
974
|
+
puts "error: #{locale[0]}: line #{locale[1]} #{msg}"
|
|
975
|
+
if locale[0] != nil && locale[0] != @processing_file
|
|
976
|
+
puts " #{locale[0]} is included from #{@processing_file}"
|
|
977
|
+
end
|
|
978
|
+
else
|
|
979
|
+
puts "error: #{msg}"
|
|
980
|
+
end
|
|
981
|
+
end ##error
|
|
982
|
+
|
|
983
|
+
# このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
|
|
984
|
+
def warning( msg )
|
|
985
|
+
@@n_warning += 1
|
|
986
|
+
locale = @@current_locale
|
|
987
|
+
puts "warning: #{locale[0]}: line #{locale[1]} #{msg}"
|
|
988
|
+
end
|
|
989
|
+
|
|
990
|
+
def self.get_n_error
|
|
991
|
+
@@n_error
|
|
992
|
+
end
|
|
993
|
+
|
|
994
|
+
def self.get_n_warning
|
|
995
|
+
@@n_warning
|
|
996
|
+
end
|
|
997
|
+
|
|
998
|
+
def set_no_type_name b_no_type_name
|
|
999
|
+
# print "b_no_type_name=#{b_no_type_name}\n"
|
|
1000
|
+
@b_no_type_name = b_no_type_name
|
|
1001
|
+
end
|
|
1002
|
+
|
|
1003
|
+
---- footer
|
|
1004
|
+
|
|
1005
|
+
|
|
1006
|
+
|
|
1007
|
+
class Token
|
|
1008
|
+
# @parameter
|
|
1009
|
+
# SIZE_IS, STRING, COUNT_IS : expression
|
|
1010
|
+
# SEND, RECEIVE : string ( IDENTIFIER )
|
|
1011
|
+
|
|
1012
|
+
attr_accessor :val, :file, :lineno, :col
|
|
1013
|
+
|
|
1014
|
+
def initialize(val, file, lineno, col)
|
|
1015
|
+
@val = val
|
|
1016
|
+
@file = file
|
|
1017
|
+
@lineno = lineno
|
|
1018
|
+
@col = col
|
|
1019
|
+
|
|
1020
|
+
end
|
|
1021
|
+
|
|
1022
|
+
def to_s
|
|
1023
|
+
@val.to_s
|
|
1024
|
+
end
|
|
1025
|
+
|
|
1026
|
+
def to_sym
|
|
1027
|
+
@val.to_sym
|
|
1028
|
+
end
|
|
1029
|
+
|
|
1030
|
+
def get_name
|
|
1031
|
+
@val
|
|
1032
|
+
end
|
|
1033
|
+
|
|
1034
|
+
def set_parameter( parameter )
|
|
1035
|
+
@parameter = parameter
|
|
1036
|
+
end
|
|
1037
|
+
|
|
1038
|
+
def scan(*arg, &block)
|
|
1039
|
+
val.to_s.scan(*arg, &block)
|
|
1040
|
+
end
|
|
1041
|
+
|
|
1042
|
+
def to_i
|
|
1043
|
+
if @val.is_a? Integer
|
|
1044
|
+
@val.to_i
|
|
1045
|
+
else
|
|
1046
|
+
raise TypeError
|
|
1047
|
+
end
|
|
1048
|
+
end
|
|
1049
|
+
|
|
1050
|
+
def locale
|
|
1051
|
+
[@file, @lineno, @col]
|
|
1052
|
+
end
|
|
1053
|
+
|
|
1054
|
+
def eql?(other)
|
|
1055
|
+
if other.is_a? Symbol
|
|
1056
|
+
@val == other
|
|
1057
|
+
elsif other.is_a? Token
|
|
1058
|
+
@val == other.val
|
|
1059
|
+
elsif other.is_a? String
|
|
1060
|
+
@val.to_s == other
|
|
1061
|
+
else
|
|
1062
|
+
raise ArgumentError
|
|
1063
|
+
end
|
|
1064
|
+
end
|
|
1065
|
+
|
|
1066
|
+
alias == eql?
|
|
1067
|
+
|
|
1068
|
+
def <=>(other)
|
|
1069
|
+
if other.class == Token
|
|
1070
|
+
if @val.is_a? Integer
|
|
1071
|
+
@val <=> other.val
|
|
1072
|
+
elsif @val.is_a? Symbol
|
|
1073
|
+
@val.to_s <=> other.val.to_s
|
|
1074
|
+
else
|
|
1075
|
+
raise ArgumentError
|
|
1076
|
+
end
|
|
1077
|
+
else
|
|
1078
|
+
raise ArgumentError
|
|
1079
|
+
end
|
|
1080
|
+
end
|
|
1081
|
+
|
|
1082
|
+
def show_tree( indent )
|
|
1083
|
+
indent.times { print " " }
|
|
1084
|
+
print "#{@val}\n"
|
|
1085
|
+
end
|
|
1086
|
+
|
|
1087
|
+
end # class C_Parser
|