expressir 0.2.0 → 0.2.1

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.
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