expressir 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/demo.rb +3 -1
  3. data/expressir.gemspec +1 -1
  4. data/lib/expressir/express.rb +0 -1
  5. data/lib/expressir/express_exp/generated/ExpressLexer.rb +235 -232
  6. data/lib/expressir/express_exp/generated/ExpressParser.rb +1461 -1435
  7. data/lib/expressir/express_exp/parser.rb +8 -3
  8. data/lib/expressir/express_exp/visitor.rb +167 -136
  9. data/lib/expressir/model.rb +91 -0
  10. data/lib/expressir/model/constant.rb +2 -0
  11. data/lib/expressir/model/derived.rb +4 -0
  12. data/lib/expressir/model/entity.rb +12 -0
  13. data/lib/expressir/model/enumeration_item.rb +13 -0
  14. data/lib/expressir/model/explicit.rb +4 -0
  15. data/lib/expressir/model/expressions/aggregate_initializer.rb +13 -0
  16. data/lib/expressir/model/expressions/query.rb +8 -0
  17. data/lib/expressir/model/function.rb +31 -0
  18. data/lib/expressir/model/inverse.rb +4 -0
  19. data/lib/expressir/model/literals/binary.rb +13 -0
  20. data/lib/expressir/model/literals/integer.rb +13 -0
  21. data/lib/expressir/model/literals/logical.rb +13 -0
  22. data/lib/expressir/model/literals/real.rb +13 -0
  23. data/lib/expressir/model/literals/string.rb +15 -0
  24. data/lib/expressir/model/local.rb +2 -0
  25. data/lib/expressir/model/parameter.rb +2 -0
  26. data/lib/expressir/model/procedure.rb +31 -0
  27. data/lib/expressir/model/repository.rb +6 -0
  28. data/lib/expressir/model/rule.rb +31 -0
  29. data/lib/expressir/model/schema.rb +10 -0
  30. data/lib/expressir/model/statements/alias.rb +8 -0
  31. data/lib/expressir/model/statements/case_action.rb +2 -2
  32. data/lib/expressir/model/statements/if.rb +2 -2
  33. data/lib/expressir/model/statements/repeat.rb +10 -2
  34. data/lib/expressir/model/subtype_constraint.rb +2 -0
  35. data/lib/expressir/model/type.rb +8 -0
  36. data/lib/expressir/model/types/aggregate.rb +2 -0
  37. data/lib/expressir/model/types/enumeration.rb +4 -4
  38. data/lib/expressir/model/types/generic.rb +2 -0
  39. data/lib/expressir/model/types/generic_entity.rb +2 -0
  40. data/lib/expressir/model/types/select.rb +4 -4
  41. data/lib/expressir/model/unique.rb +2 -0
  42. data/lib/expressir/model/where.rb +2 -0
  43. data/lib/expressir/version.rb +1 -1
  44. data/original/examples/syntax/remark.exp +127 -0
  45. data/original/examples/syntax/syntax.exp +15 -10
  46. data/spec/expressir/express_exp/remark_spec.rb +301 -0
  47. data/spec/expressir/express_exp/syntax_spec.rb +659 -307
  48. metadata +15 -6
  49. data/lib/expressir/model/expressions/unknown.rb +0 -8
@@ -14,11 +14,16 @@ module Expressir
14
14
  lexer = Generated::ExpressLexer.new(char_stream)
15
15
  token_stream = Antlr4::Runtime::CommonTokenStream.new(lexer)
16
16
  parser = Generated::ExpressParser.new(token_stream)
17
-
17
+
18
+ # don't attempt to recover from any parsing error
19
+ parser.instance_variable_set(:@_err_handler, Antlr4::Runtime::BailErrorStrategy.new)
20
+
18
21
  parse_tree = parser.syntax()
19
22
 
20
- visitor = Visitor.new()
21
- visitor.visit(parse_tree)
23
+ visitor = Visitor.new(token_stream)
24
+ repo = visitor.visit(parse_tree)
25
+
26
+ repo
22
27
  end
23
28
  end
24
29
  end
@@ -1,89 +1,5 @@
1
1
  require 'expressir/express_exp/generated/ExpressBaseVisitor'
2
- require 'expressir/model/constant'
3
- require 'expressir/model/derived'
4
- require 'expressir/model/entity'
5
- require 'expressir/model/explicit'
6
- require 'expressir/model/function'
7
- require 'expressir/model/inverse'
8
- require 'expressir/model/local'
9
- require 'expressir/model/parameter'
10
- require 'expressir/model/procedure'
11
- require 'expressir/model/ref'
12
- require 'expressir/model/reference'
13
- require 'expressir/model/renamed_ref'
14
- require 'expressir/model/repository'
15
- require 'expressir/model/rule'
16
- require 'expressir/model/schema'
17
- require 'expressir/model/subtype_constraint'
18
- require 'expressir/model/type'
19
- require 'expressir/model/unique'
20
- require 'expressir/model/use'
21
- require 'expressir/model/where'
22
- require 'expressir/model/expressions/aggregate_element'
23
- require 'expressir/model/expressions/attribute_qualifier'
24
- require 'expressir/model/expressions/entity_constructor'
25
- require 'expressir/model/expressions/expression'
26
- require 'expressir/model/expressions/function_call'
27
- require 'expressir/model/expressions/group_qualifier'
28
- require 'expressir/model/expressions/index_qualifier'
29
- require 'expressir/model/expressions/interval'
30
- require 'expressir/model/expressions/qualified_ref'
31
- require 'expressir/model/expressions/query'
32
- require 'expressir/model/expressions/unknown'
33
- require 'expressir/model/operators/addition'
34
- require 'expressir/model/operators/and'
35
- require 'expressir/model/operators/andor'
36
- require 'expressir/model/operators/combine'
37
- require 'expressir/model/operators/equal'
38
- require 'expressir/model/operators/exponentiation'
39
- require 'expressir/model/operators/greater_than'
40
- require 'expressir/model/operators/greater_than_or_equal'
41
- require 'expressir/model/operators/in'
42
- require 'expressir/model/operators/instance_equal'
43
- require 'expressir/model/operators/instance_not_equal'
44
- require 'expressir/model/operators/integer_division'
45
- require 'expressir/model/operators/less_than'
46
- require 'expressir/model/operators/less_than_or_equal'
47
- require 'expressir/model/operators/like'
48
- require 'expressir/model/operators/modulo'
49
- require 'expressir/model/operators/multiplication'
50
- require 'expressir/model/operators/not'
51
- require 'expressir/model/operators/not_equal'
52
- require 'expressir/model/operators/oneof'
53
- require 'expressir/model/operators/or'
54
- require 'expressir/model/operators/real_division'
55
- require 'expressir/model/operators/subtraction'
56
- require 'expressir/model/operators/unary_plus'
57
- require 'expressir/model/operators/unary_minus'
58
- require 'expressir/model/operators/xor'
59
- require 'expressir/model/statements/alias'
60
- require 'expressir/model/statements/assignment'
61
- require 'expressir/model/statements/case'
62
- require 'expressir/model/statements/case_action'
63
- require 'expressir/model/statements/compound'
64
- require 'expressir/model/statements/escape'
65
- require 'expressir/model/statements/if'
66
- require 'expressir/model/statements/null'
67
- require 'expressir/model/statements/procedure_call'
68
- require 'expressir/model/statements/repeat'
69
- require 'expressir/model/statements/return'
70
- require 'expressir/model/statements/skip'
71
- require 'expressir/model/types/aggregate'
72
- require 'expressir/model/types/array'
73
- require 'expressir/model/types/bag'
74
- require 'expressir/model/types/binary'
75
- require 'expressir/model/types/boolean'
76
- require 'expressir/model/types/enumeration'
77
- require 'expressir/model/types/generic_entity'
78
- require 'expressir/model/types/generic'
79
- require 'expressir/model/types/integer'
80
- require 'expressir/model/types/list'
81
- require 'expressir/model/types/logical'
82
- require 'expressir/model/types/number'
83
- require 'expressir/model/types/real'
84
- require 'expressir/model/types/set'
85
- require 'expressir/model/types/select'
86
- require 'expressir/model/types/string'
2
+ require 'expressir/model'
87
3
 
88
4
  # issues:
89
5
  #
@@ -107,6 +23,77 @@ require 'expressir/model/types/string'
107
23
  module Expressir
108
24
  module ExpressExp
109
25
  class Visitor < Generated::ExpressBaseVisitor
26
+ REMARK_CHANNEL = 2
27
+
28
+ def initialize(tokens)
29
+ @tokens = tokens
30
+ @attached_remarks = Set.new
31
+ end
32
+
33
+ def visit(ctx)
34
+ result = super(ctx)
35
+ attach_remarks(ctx, result)
36
+ result
37
+ end
38
+
39
+ def attach_remarks(ctx, item)
40
+ # get remark tokens
41
+ start_index, stop_index = if ctx.instance_of? Generated::ExpressParser::SyntaxContext
42
+ [0, @tokens.size - 1]
43
+ else
44
+ [ctx.start.token_index, ctx.stop.token_index]
45
+ end
46
+ # puts [start_index, stop_index, ctx.class].inspect
47
+
48
+ remark_tokens = @tokens.filter_for_channel(start_index, stop_index, REMARK_CHANNEL)
49
+ if remark_tokens
50
+ remark_tokens.each do |remark_token|
51
+ remark_text = remark_token.text
52
+
53
+ # check if it is tagged remark
54
+ match = if remark_text.start_with?('--')
55
+ remark_text[2..-1].match(/^"([^"]*)"(.*)$/)
56
+ elsif remark_text.start_with?('(*') and remark_text.end_with?('*)')
57
+ remark_text[2..-3].match(/^"([^"]*)"(.*)$/m)
58
+ end
59
+ if !match
60
+ next
61
+ end
62
+
63
+ # don't attach already attached tagged remark
64
+ if @attached_remarks.include? remark_token
65
+ next
66
+ end
67
+
68
+ # attach tagged remark
69
+ remark_tag = match[1]
70
+ remark_content = match[2].strip
71
+
72
+ current_item = item
73
+ remark_tag.split('.').each do |id|
74
+ if current_item
75
+ if current_item.class.method_defined? :scope_items
76
+ current_item = current_item.scope_items.find{|x| x.id == id}
77
+ else
78
+ current_item = nil
79
+ break
80
+ end
81
+ else
82
+ break
83
+ end
84
+ end
85
+
86
+ if current_item
87
+ current_item.remarks ||= []
88
+ current_item.remarks << remark_content
89
+
90
+ # mark remark as attached, so that it is not attached again at higher nesting level
91
+ @attached_remarks << remark_token
92
+ end
93
+ end
94
+ end
95
+ end
96
+
110
97
  def visitAttributeRef(ctx)
111
98
  id = visit(ctx.attributeId())
112
99
 
@@ -250,7 +237,11 @@ module Expressir
250
237
  end
251
238
 
252
239
  def visitAggregateInitializer(ctx)
253
- ctx.element().map{|ctx| visit(ctx)}
240
+ items = ctx.element().map{|ctx| visit(ctx)}
241
+
242
+ Model::Expressions::AggregateInitializer.new({
243
+ items: items
244
+ })
254
245
  end
255
246
 
256
247
  def visitAggregateSource(ctx)
@@ -347,13 +338,7 @@ module Expressir
347
338
  end
348
339
 
349
340
  def visitAttributeDecl(ctx)
350
- if ctx.attributeId()
351
- visit(ctx.attributeId())
352
- elsif ctx.redeclaredAttribute()
353
- visit(ctx.redeclaredAttribute())
354
- else
355
- raise 'Invalid state'
356
- end
341
+ raise 'Invalid state'
357
342
  end
358
343
 
359
344
  def visitAttributeId(ctx)
@@ -439,12 +424,12 @@ module Expressir
439
424
  end
440
425
 
441
426
  def visitCaseAction(ctx)
442
- labels = ctx.caseLabel().map{|ctx| visit(ctx.expression())}
427
+ expressions = ctx.caseLabel().map{|ctx| visit(ctx.expression())}
443
428
  statement = visit(ctx.stmt())
444
429
 
445
- labels.map do |label|
430
+ expressions.map do |expression|
446
431
  Model::Statements::CaseAction.new({
447
- label: label,
432
+ expression: expression,
448
433
  statement: statement
449
434
  })
450
435
  end
@@ -545,12 +530,20 @@ module Expressir
545
530
  end
546
531
 
547
532
  def visitDerivedAttr(ctx)
548
- id = visit(ctx.attributeDecl())
533
+ id = if ctx.attributeDecl().attributeId()
534
+ visit(ctx.attributeDecl().attributeId())
535
+ elsif ctx.attributeDecl().redeclaredAttribute() && ctx.attributeDecl().redeclaredAttribute().attributeId()
536
+ visit(ctx.attributeDecl().redeclaredAttribute().attributeId())
537
+ end
538
+ supertype_attribute = if ctx.attributeDecl().redeclaredAttribute() && ctx.attributeDecl().redeclaredAttribute().qualifiedAttribute()
539
+ visit(ctx.attributeDecl().redeclaredAttribute().qualifiedAttribute())
540
+ end
549
541
  type = visit(ctx.parameterType())
550
542
  expression = visit(ctx.expression())
551
543
 
552
544
  Model::Derived.new({
553
545
  id: id,
546
+ supertype_attribute: supertype_attribute,
554
547
  type: type,
555
548
  expression: expression
556
549
  })
@@ -684,21 +677,21 @@ module Expressir
684
677
 
685
678
  def visitEnumerationType(ctx)
686
679
  extensible = !!ctx.EXTENSIBLE()
687
- list = if ctx.enumerationItems()
688
- ctx.enumerationItems().enumerationId().map{|ctx| visit(ctx)}
680
+ items = if ctx.enumerationItems()
681
+ ctx.enumerationItems().enumerationId().map{|ctx| handleEnumerationItem(ctx)}
689
682
  end
690
683
  extension_type = if ctx.enumerationExtension()
691
684
  visit(ctx.enumerationExtension().typeRef())
692
685
  end
693
- extension_list = if ctx.enumerationExtension() && ctx.enumerationExtension().enumerationItems()
694
- ctx.enumerationExtension().enumerationItems().enumerationId().map{|ctx| visit(ctx)}
686
+ extension_items = if ctx.enumerationExtension() && ctx.enumerationExtension().enumerationItems()
687
+ ctx.enumerationExtension().enumerationItems().enumerationId().map{|ctx| handleEnumerationItem(ctx)}
695
688
  end
696
689
 
697
690
  Model::Types::Enumeration.new({
698
691
  extensible: extensible,
699
- list: list,
692
+ items: items,
700
693
  extension_type: extension_type,
701
- extension_list: extension_list
694
+ extension_items: extension_items
702
695
  })
703
696
  end
704
697
 
@@ -707,13 +700,22 @@ module Expressir
707
700
  end
708
701
 
709
702
  def visitExplicitAttr(ctx)
710
- ids = ctx.attributeDecl().map{|ctx| visit(ctx)}
703
+ decls = ctx.attributeDecl()
711
704
  optional = !!ctx.OPTIONAL()
712
705
  type = visit(ctx.parameterType())
713
706
 
714
- ids.map do |id|
707
+ decls.map do |decl|
708
+ id = if decl.attributeId()
709
+ visit(decl.attributeId())
710
+ elsif decl.redeclaredAttribute() && decl.redeclaredAttribute().attributeId()
711
+ visit(decl.redeclaredAttribute().attributeId())
712
+ end
713
+ supertype_attribute = if decl.redeclaredAttribute() && decl.redeclaredAttribute().qualifiedAttribute()
714
+ visit(decl.redeclaredAttribute().qualifiedAttribute())
715
+ end
715
716
  Model::Explicit.new({
716
717
  id: id,
718
+ supertype_attribute: supertype_attribute,
717
719
  optional: optional,
718
720
  type: type
719
721
  })
@@ -948,7 +950,7 @@ module Expressir
948
950
  end
949
951
 
950
952
  def visitIfStmt(ctx)
951
- condition = visit(ctx.logicalExpression().expression())
953
+ expression = visit(ctx.logicalExpression().expression())
952
954
  else_index = if ctx.ELSE()
953
955
  ctx.children.find_index{|x| x == ctx.ELSE()}
954
956
  end
@@ -965,7 +967,7 @@ module Expressir
965
967
  end
966
968
 
967
969
  Model::Statements::If.new({
968
- condition: condition,
970
+ expression: expression,
969
971
  statements: statements,
970
972
  else_statements: else_statements
971
973
  })
@@ -1066,7 +1068,14 @@ module Expressir
1066
1068
  end
1067
1069
 
1068
1070
  def visitInverseAttr(ctx)
1069
- id = visit(ctx.attributeDecl())
1071
+ id = if ctx.attributeDecl().attributeId()
1072
+ visit(ctx.attributeDecl().attributeId())
1073
+ elsif ctx.attributeDecl().redeclaredAttribute() && ctx.attributeDecl().redeclaredAttribute().attributeId()
1074
+ visit(ctx.attributeDecl().redeclaredAttribute().attributeId())
1075
+ end
1076
+ supertype_attribute = if ctx.attributeDecl().redeclaredAttribute() && ctx.attributeDecl().redeclaredAttribute().qualifiedAttribute()
1077
+ visit(ctx.attributeDecl().redeclaredAttribute().qualifiedAttribute())
1078
+ end
1070
1079
  type = if ctx.SET()
1071
1080
  bound1, bound2 = if ctx.boundSpec()
1072
1081
  [
@@ -1116,6 +1125,7 @@ module Expressir
1116
1125
 
1117
1126
  Model::Inverse.new({
1118
1127
  id: id,
1128
+ supertype_attribute: supertype_attribute,
1119
1129
  type: type,
1120
1130
  attribute: attribute
1121
1131
  })
@@ -1184,15 +1194,19 @@ module Expressir
1184
1194
  end
1185
1195
 
1186
1196
  def visitLogicalLiteral(ctx)
1187
- if ctx.TRUE()
1197
+ value = if ctx.TRUE()
1188
1198
  true
1189
1199
  elsif ctx.FALSE()
1190
1200
  false
1191
1201
  elsif ctx.UNKNOWN()
1192
- Model::Expressions::Unknown.new()
1202
+ nil
1193
1203
  else
1194
1204
  raise 'Invalid state'
1195
1205
  end
1206
+
1207
+ Model::Literals::Logical.new({
1208
+ value: value
1209
+ })
1196
1210
  end
1197
1211
 
1198
1212
  def visitLogicalType(ctx)
@@ -1436,17 +1450,7 @@ module Expressir
1436
1450
  end
1437
1451
 
1438
1452
  def visitRedeclaredAttribute(ctx)
1439
- if ctx.attributeId()
1440
- ref = visit(ctx.qualifiedAttribute())
1441
- id = visit(ctx.attributeId())
1442
-
1443
- Model::RenamedRef.new({
1444
- ref: ref,
1445
- id: id
1446
- })
1447
- else
1448
- visit(ctx.qualifiedAttribute())
1449
- end
1453
+ raise 'Invalid state'
1450
1454
  end
1451
1455
 
1452
1456
  def visitReferencedAttribute(ctx)
@@ -1524,7 +1528,7 @@ module Expressir
1524
1528
  end
1525
1529
 
1526
1530
  def visitRepeatStmt(ctx)
1527
- variable = if ctx.repeatControl().incrementControl()
1531
+ id = if ctx.repeatControl().incrementControl()
1528
1532
  visit(ctx.repeatControl().incrementControl().variableId())
1529
1533
  end
1530
1534
  bound1, bound2 = if ctx.repeatControl().incrementControl()
@@ -1545,7 +1549,7 @@ module Expressir
1545
1549
  statements = ctx.stmt().map{|ctx| visit(ctx)}
1546
1550
 
1547
1551
  Model::Statements::Repeat.new({
1548
- variable: variable,
1552
+ id: id,
1549
1553
  bound1: bound1,
1550
1554
  bound2: bound2,
1551
1555
  increment: increment,
@@ -1682,22 +1686,22 @@ module Expressir
1682
1686
  def visitSelectType(ctx)
1683
1687
  extensible = !!ctx.EXTENSIBLE()
1684
1688
  generic_entity = !!ctx.GENERIC_ENTITY()
1685
- list = if ctx.selectList()
1689
+ items = if ctx.selectList()
1686
1690
  ctx.selectList().namedTypes().map{|ctx| visit(ctx)}
1687
1691
  end
1688
1692
  extension_type = if ctx.selectExtension()
1689
1693
  visit(ctx.selectExtension().typeRef())
1690
1694
  end
1691
- extension_list = if ctx.selectExtension() && ctx.selectExtension().selectList()
1695
+ extension_items = if ctx.selectExtension() && ctx.selectExtension().selectList()
1692
1696
  ctx.selectExtension().selectList().namedTypes().map{|ctx| visit(ctx)}
1693
1697
  end
1694
1698
 
1695
1699
  Model::Types::Select.new({
1696
1700
  extensible: extensible,
1697
1701
  generic_entity: generic_entity,
1698
- list: list,
1702
+ items: items,
1699
1703
  extension_type: extension_type,
1700
- extension_list: extension_list
1704
+ extension_items: extension_items
1701
1705
  })
1702
1706
  end
1703
1707
 
@@ -2053,6 +2057,16 @@ module Expressir
2053
2057
  raise 'Invalid state'
2054
2058
  end
2055
2059
 
2060
+ private
2061
+
2062
+ def handleEnumerationItem(ctx)
2063
+ id = handleSimpleId(ctx.SimpleId())
2064
+
2065
+ Model::EnumerationItem.new({
2066
+ id: id
2067
+ })
2068
+ end
2069
+
2056
2070
  def handleBinaryExpression(operands, operators)
2057
2071
  if operands.length != operators.length + 1
2058
2072
  raise 'Invalid state'
@@ -2072,16 +2086,27 @@ module Expressir
2072
2086
  end
2073
2087
 
2074
2088
  def handleBinaryLiteral(ctx)
2075
- bin = ctx.text[1..(ctx.text.length - 1)]
2076
- [bin].pack('B*')
2089
+ value = ctx.text[1..(ctx.text.length - 1)]
2090
+
2091
+ Model::Literals::Binary.new({
2092
+ value: value
2093
+ })
2077
2094
  end
2078
2095
 
2079
2096
  def handleIntegerLiteral(ctx)
2080
- ctx.text.to_i
2097
+ value = ctx.text
2098
+
2099
+ Model::Literals::Integer.new({
2100
+ value: value
2101
+ })
2081
2102
  end
2082
2103
 
2083
2104
  def handleRealLiteral(ctx)
2084
- ctx.text.to_f
2105
+ value = ctx.text
2106
+
2107
+ Model::Literals::Real.new({
2108
+ value: value
2109
+ })
2085
2110
  end
2086
2111
 
2087
2112
  def handleSimpleId(ctx)
@@ -2089,14 +2114,20 @@ module Expressir
2089
2114
  end
2090
2115
 
2091
2116
  def handleSimpleStringLiteral(ctx)
2092
- ctx.text[1..(ctx.text.length - 2)]
2117
+ value = ctx.text[1..(ctx.text.length - 2)]
2118
+
2119
+ Model::Literals::String.new({
2120
+ value: value
2121
+ })
2093
2122
  end
2094
2123
 
2095
2124
  def handleEncodedStringLiteral(ctx)
2096
- hex = ctx.text[1..(ctx.text.length - 2)]
2097
- str = [hex].pack('H*')
2098
- str.force_encoding('UCS-4BE')
2099
- str.encode('ASCII-8BIT')
2125
+ value = ctx.text[1..(ctx.text.length - 2)]
2126
+
2127
+ Model::Literals::String.new({
2128
+ value: value,
2129
+ encoded: true
2130
+ })
2100
2131
  end
2101
2132
  end
2102
2133
  end