Parker Schuh | 343481e | 2014-02-09 18:28:43 -0800 | [diff] [blame] | 1 | |
| 2 | class StructStmt |
| 3 | def initialize(name,suite) |
| 4 | @name = name |
| 5 | @suite = suite |
| 6 | end |
| 7 | def q_eval(locals) |
| 8 | group = Target::StructDec.new(@name) |
| 9 | locals.register(group) |
| 10 | @suite.each do |stmt| |
| 11 | stmt.q_eval(locals.bind(group)) |
| 12 | end |
| 13 | return group |
| 14 | end |
| 15 | def self.parse(tokens) |
| 16 | name = tokens.expect(:tWord).data |
| 17 | values = [] |
| 18 | tokens.expect(:tOpenB) |
| 19 | while(tokens.peak != :tCloseB) |
| 20 | values << MessageElementStmt.parse(tokens) |
| 21 | end |
| 22 | names = {} |
| 23 | values.each do |val| |
| 24 | if(names[val.name]) |
| 25 | raise QSyntaxError.new(<<ERROR_MSG) |
| 26 | Hey! duplicate name #{val.name.inspect} in your message declaration statement (message #{name}). |
| 27 | \tI found them at: #{names[val.name].q_stack_name()} and #{val.q_stack_name()}. |
| 28 | \tWot. Wot. |
| 29 | ERROR_MSG |
| 30 | end |
| 31 | names[val.name] = val |
| 32 | end |
| 33 | tokens.expect(:tCloseB) |
| 34 | tokens.expect(:tSemi) |
| 35 | self.new(name,values) |
| 36 | end |
| 37 | end |