added support for structures in q syntax.
diff --git a/aos/build/queues/objects/namespaces.rb b/aos/build/queues/objects/namespaces.rb
index b799d36..74f7197 100644
--- a/aos/build/queues/objects/namespaces.rb
+++ b/aos/build/queues/objects/namespaces.rb
@@ -43,7 +43,7 @@
end
class BoundSituation < LocalSituation
def initialize(locals,bind_to)
- @globals = globals
+ @globals = locals.globals
@local = bind_to
end
end
diff --git a/aos/build/queues/objects/q_file.rb b/aos/build/queues/objects/q_file.rb
index f683dda..beaf8f0 100644
--- a/aos/build/queues/objects/q_file.rb
+++ b/aos/build/queues/objects/q_file.rb
@@ -134,6 +134,8 @@
suite << QueueStmt.parse(tokens)
when "interface"
suite << InterfaceStmt.parse(tokens)
+ when "struct"
+ suite << StructStmt.parse(tokens)
else
tokens.qError(<<ERROR_MSG)
expected a "package","import","queue","queue_group", or "message" statement rather
diff --git a/aos/build/queues/objects/q_struct.rb b/aos/build/queues/objects/q_struct.rb
new file mode 100644
index 0000000..cd47fe6
--- /dev/null
+++ b/aos/build/queues/objects/q_struct.rb
@@ -0,0 +1,37 @@
+
+class StructStmt
+ def initialize(name,suite)
+ @name = name
+ @suite = suite
+ end
+ def q_eval(locals)
+ group = Target::StructDec.new(@name)
+ locals.register(group)
+ @suite.each do |stmt|
+ stmt.q_eval(locals.bind(group))
+ end
+ return group
+ end
+ def self.parse(tokens)
+ name = tokens.expect(:tWord).data
+ values = []
+ tokens.expect(:tOpenB)
+ while(tokens.peak != :tCloseB)
+ values << MessageElementStmt.parse(tokens)
+ end
+ names = {}
+ values.each do |val|
+ if(names[val.name])
+ raise QSyntaxError.new(<<ERROR_MSG)
+Hey! duplicate name #{val.name.inspect} in your message declaration statement (message #{name}).
+\tI found them at: #{names[val.name].q_stack_name()} and #{val.q_stack_name()}.
+\tWot. Wot.
+ERROR_MSG
+ end
+ names[val.name] = val
+ end
+ tokens.expect(:tCloseB)
+ tokens.expect(:tSemi)
+ self.new(name,values)
+ end
+end
diff --git a/aos/build/queues/objects/queue.rb b/aos/build/queues/objects/queue.rb
index e993eb9..1199cc2 100644
--- a/aos/build/queues/objects/queue.rb
+++ b/aos/build/queues/objects/queue.rb
@@ -1,12 +1,13 @@
class MessageElementStmt < QStmt
attr_accessor :name
- def initialize(type,name,length = nil) #lengths are for arrays
- @type = type
+ def initialize(type_name,name,length = nil) #lengths are for arrays
+ @type_name = type_name
+ @type = type_name.to_s
@name = name
@length = length
end
CommonMistakes = {"short" => "int16_t","int" => "int32_t","long" => "int64_t"}
- def check_type_error()
+ def check_type_error(locals)
if(!(Sizes[@type] || (@length != nil && @type == "char")) )
if(correction = CommonMistakes[@type])
raise QError.new(<<ERROR_MSG)
@@ -23,11 +24,13 @@
\tWot. Wot.
ERROR_MSG
else
+ @is_struct_type = true
+ return if(lookup_type(locals))
raise QError.new(<<ERROR_MSG)
Hey! you have a \"#{@type}\" in your message statement.
\tThat is not in the list of supported types.
\there is the list of supported types:
-\tint{8,16,32,64}_t,uint{8,16,32,64}_t,bool,float,double#{len_comment}
+\tint{8,16,32,64}_t,uint{8,16,32,64}_t,bool,float,double
\tWot. Wot.
ERROR_MSG
end
@@ -72,21 +75,30 @@
\tWot. Wot.
ERROR_MSG
end
+ def lookup_type(locals)
+ return @type_name.lookup(locals)
+ end
def q_eval(locals)
- check_type_error()
- if(@length == nil)
- member = Target::MessageElement.new(@type,@name)
+ check_type_error(locals)
+ if(@is_struct_type)
+ tval = lookup_type(locals)
+ member = Target::MessageStructElement.new(tval, name)
else
- member = Target::MessageArrayElement.new(@type,@name,@length)
+ if(@length == nil)
+ member = Target::MessageElement.new(@type,@name)
+ else
+ member = Target::MessageArrayElement.new(@type,@name,@length)
+ end
+ member.size = size()
+ member.zero = Zero[@type] || "0";
+ member.printformat = toPrintFormat()
end
- member.size = size()
- member.zero = Zero[@type] || "0";
- member.printformat = toPrintFormat()
locals.local.add_member(member)
end
def self.parse(tokens)
line = tokens.pos
- type = tokens.expect(:tWord).data
+ #type = tokens.expect(:tWord).data
+ type_name = QualifiedName.parse(tokens)
len = nil
if(tokens.peak == :tOpenB)
tokens.expect(:tOpenB)
@@ -95,7 +107,7 @@
end
name = tokens.expect(:tWord).data
tokens.expect(:tSemi)
- return self.new(type,name,len).set_line(line)
+ return self.new(type_name,name,len).set_line(line)
end
end
class MessageStmt < QStmt