expressir 1.2.3-aarch64-linux → 1.2.6-aarch64-linux

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/.cross_rubies +0 -6
  3. data/.github/workflows/rake.yml +223 -31
  4. data/.gitignore +7 -1
  5. data/.gitmodules +3 -0
  6. data/.rubocop.yml +13 -4
  7. data/README.adoc +8 -0
  8. data/Rakefile +4 -1
  9. data/bin/console +0 -1
  10. data/bin/rspec +3 -3
  11. data/exe/expressir +4 -2
  12. data/exe/format +1 -1
  13. data/exe/format-test +25 -25
  14. data/exe/generate-parser +16 -13
  15. data/expressir.gemspec +11 -9
  16. data/lib/expressir/config.rb +1 -1
  17. data/lib/expressir/express/2.7/express_parser.so +0 -0
  18. data/lib/expressir/express/3.0/express_parser.so +0 -0
  19. data/lib/expressir/express/3.1/express_parser.so +0 -0
  20. data/lib/expressir/express/parser.rb +17 -15
  21. data/lib/expressir/express/visitor.rb +7 -3
  22. data/lib/expressir/model.rb +78 -78
  23. data/lib/expressir/version.rb +1 -1
  24. data/rakelib/antlr4-native.rake +161 -0
  25. data/rakelib/cross-ruby.rake +213 -162
  26. data/spec/acceptance/version_spec.rb +17 -2
  27. data/spec/expressir/express/cache_spec.rb +23 -5
  28. data/spec/expressir/express/formatter_spec.rb +54 -8
  29. data/spec/expressir/express/parser_spec.rb +47 -11
  30. data/spec/expressir/model/model_element_spec.rb +198 -146
  31. data/spec/spec_helper.rb +7 -0
  32. metadata +52 -61
  33. data/demo.rb +0 -18
  34. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.exp +0 -9589
  35. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.owl +0 -36619
  36. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.xml +0 -13294
  37. data/original/examples/employment/eclipse/.project +0 -17
  38. data/original/examples/employment/eclipse/Export/Employment.png +0 -0
  39. data/original/examples/employment/eclipse/Express/employment_schema.exp +0 -33
  40. data/original/examples/employment/eclipse/Express/employment_schema.xmi +0 -77
  41. data/original/examples/employment/eclipse/Express/employment_schema.xml +0 -93
  42. data/original/examples/employment/eclipse/Models/Employment.uml +0 -4
  43. data/original/examples/employment/eclipse/Models/Employment.umldi +0 -240
  44. data/original/examples/employment/eclipse/readme.txt +0 -7
  45. data/original/examples/employment/employment_schema.exp +0 -33
  46. data/original/examples/employment/employment_schema.rb +0 -232
  47. data/original/examples/employment/employment_schema.xml +0 -93
  48. data/original/examples/employment/employment_schema___module.rb +0 -46
  49. data/original/examples/employment/employment_schema___p28attr.rb +0 -126
  50. data/original/examples/employment/employment_schema___p28inst.rb +0 -26
  51. data/original/examples/employment/example_employment_data.xml +0 -1
  52. data/original/examples/employment/example_employment_data_copy.xml +0 -1
  53. data/original/examples/employment/example_employment_reader.rb +0 -30
  54. data/original/examples/employment/example_employment_writer.rb +0 -51
  55. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.exp +0 -3710
  56. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.owl +0 -35880
  57. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xmi +0 -15357
  58. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xml +0 -9468
  59. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.exp +0 -8404
  60. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.owl +0 -43147
  61. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xmi +0 -18341
  62. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xml +0 -11632
  63. data/original/exp2ruby.rb +0 -525
  64. data/original/expsm.rb +0 -34
  65. data/original/mapping_owl.rb +0 -1018
  66. data/original/mapping_sysml.rb +0 -2281
  67. data/original/mapping_uml2.rb +0 -599
  68. data/original/mapping_uml2_eclipse.rb +0 -433
  69. data/original/reeper.rb +0 -134
  70. data/spec/expressr_spec.rb +0 -5
@@ -31,25 +31,27 @@ module Expressir
31
31
  # @param [Boolean] include_source attach original source code to model elements
32
32
  # @return [Model::Repository]
33
33
  def self.from_file(file, skip_references: nil, include_source: nil)
34
- input = File.read(file)
35
34
 
36
- parser = ::ExpressParser::Parser.parse(input)
35
+ # An important note re memory management
36
+ # parse, syntax, visitor methods return complex tree structures created in native (C++) extension
37
+ # visit method references nodes and leaves of this structures but it is totally untransparent for Ruby GarbageCllector
38
+ # so in this class we keep those C++ structure marked for GC so they are not freed
39
+ @parser = ::ExpressParser::ParserExt.new(file.to_s)
40
+ @parse_tree = @parser.syntax()
37
41
 
38
- parse_tree = parser.syntax()
42
+ @visitor = Visitor.new(@parser.tokens, include_source: include_source)
43
+ @repository = @visitor.visit(@parse_tree)
39
44
 
40
- visitor = Visitor.new(parser.tokens, include_source: include_source)
41
- repository = visitor.visit(parse_tree)
42
-
43
- repository.schemas.each do |schema|
45
+ @repository.schemas.each do |schema|
44
46
  schema.file = file.to_s
45
47
  end
46
48
 
47
49
  unless skip_references
48
- resolve_references_model_visitor = ResolveReferencesModelVisitor.new
49
- resolve_references_model_visitor.visit(repository)
50
+ @resolve_references_model_visitor = ResolveReferencesModelVisitor.new
51
+ @resolve_references_model_visitor.visit(@repository)
50
52
  end
51
53
 
52
- repository
54
+ @repository
53
55
  end
54
56
 
55
57
  # Parses Express files into an Express model
@@ -65,16 +67,16 @@ module Expressir
65
67
  repository.schemas
66
68
  end.flatten
67
69
 
68
- repository = Model::Repository.new(
70
+ @repository = Model::Repository.new(
69
71
  schemas: schemas
70
72
  )
71
73
 
72
- unless skip_references
73
- resolve_references_model_visitor = ResolveReferencesModelVisitor.new
74
- resolve_references_model_visitor.visit(repository)
74
+ unless @skip_references
75
+ @resolve_references_model_visitor = ResolveReferencesModelVisitor.new
76
+ @resolve_references_model_visitor.visit(@repository)
75
77
  end
76
78
 
77
- repository
79
+ @repository
78
80
  end
79
81
  end
80
82
  end
@@ -31,6 +31,8 @@ require "set"
31
31
  # - prevents segfault in ANTLR4 C++ runtime, not sure why they are caused
32
32
  # - e.g. see visit_schema_decl
33
33
 
34
+ require 'objspace'
35
+
34
36
  module Expressir
35
37
  module Express
36
38
  class Visitor < ::ExpressParser::Visitor
@@ -138,13 +140,15 @@ module Expressir
138
140
  end
139
141
 
140
142
  def attach_remarks(ctx, node)
141
- remark_tokens = get_tokens(ctx).select{|x| x.channel == REMARK_CHANNEL}
143
+ @remark_tokens = get_tokens(ctx)
144
+ @remark_tokens = @remark_tokens.select{ |x| x.channel == REMARK_CHANNEL
145
+ }
142
146
 
143
147
  # skip already attached remarks
144
- remark_tokens = remark_tokens.select{|x| !@attached_remark_tokens.include?(x)}
148
+ @remark_tokens = @remark_tokens.select{|x| !@attached_remark_tokens.include?(x)}
145
149
 
146
150
  # parse remarks, find remark targets
147
- tagged_remark_tokens = remark_tokens.map do |remark_token|
151
+ tagged_remark_tokens = @remark_tokens.map do |remark_token|
148
152
  _, remark_tag, remark_text = if remark_token.text.start_with?('--')
149
153
  remark_token.text.match(/^--"([^"]*)"(.*)$/).to_a
150
154
  else
@@ -1,79 +1,79 @@
1
- require 'expressir/model/model_element'
1
+ require "expressir/model/model_element"
2
2
 
3
- require 'expressir/model/cache'
4
- require 'expressir/model/data_type'
5
- require 'expressir/model/declaration'
6
- require 'expressir/model/expression'
7
- require 'expressir/model/identifier'
8
- require 'expressir/model/literal'
9
- require 'expressir/model/reference'
10
- require 'expressir/model/repository'
11
- require 'expressir/model/statement'
12
- require 'expressir/model/supertype_expression'
13
- require 'expressir/model/data_types/aggregate'
14
- require 'expressir/model/data_types/array'
15
- require 'expressir/model/data_types/bag'
16
- require 'expressir/model/data_types/binary'
17
- require 'expressir/model/data_types/boolean'
18
- require 'expressir/model/data_types/enumeration'
19
- require 'expressir/model/data_types/enumeration_item'
20
- require 'expressir/model/data_types/generic_entity'
21
- require 'expressir/model/data_types/generic'
22
- require 'expressir/model/data_types/integer'
23
- require 'expressir/model/data_types/list'
24
- require 'expressir/model/data_types/logical'
25
- require 'expressir/model/data_types/number'
26
- require 'expressir/model/data_types/real'
27
- require 'expressir/model/data_types/set'
28
- require 'expressir/model/data_types/select'
29
- require 'expressir/model/data_types/string'
30
- require 'expressir/model/declarations/attribute'
31
- require 'expressir/model/declarations/constant'
32
- require 'expressir/model/declarations/entity'
33
- require 'expressir/model/declarations/function'
34
- require 'expressir/model/declarations/interface'
35
- require 'expressir/model/declarations/interface_item'
36
- require 'expressir/model/declarations/interfaced_item'
37
- require 'expressir/model/declarations/parameter'
38
- require 'expressir/model/declarations/procedure'
39
- require 'expressir/model/declarations/remark_item'
40
- require 'expressir/model/declarations/rule'
41
- require 'expressir/model/declarations/schema'
42
- require 'expressir/model/declarations/schema_version'
43
- require 'expressir/model/declarations/schema_version_item'
44
- require 'expressir/model/declarations/subtype_constraint'
45
- require 'expressir/model/declarations/type'
46
- require 'expressir/model/declarations/unique_rule'
47
- require 'expressir/model/declarations/variable'
48
- require 'expressir/model/declarations/where_rule'
49
- require 'expressir/model/expressions/aggregate_initializer'
50
- require 'expressir/model/expressions/aggregate_initializer_item'
51
- require 'expressir/model/expressions/binary_expression'
52
- require 'expressir/model/expressions/entity_constructor'
53
- require 'expressir/model/expressions/function_call'
54
- require 'expressir/model/expressions/interval'
55
- require 'expressir/model/expressions/query_expression'
56
- require 'expressir/model/expressions/unary_expression'
57
- require 'expressir/model/literals/binary'
58
- require 'expressir/model/literals/integer'
59
- require 'expressir/model/literals/logical'
60
- require 'expressir/model/literals/real'
61
- require 'expressir/model/literals/string'
62
- require 'expressir/model/references/attribute_reference'
63
- require 'expressir/model/references/group_reference'
64
- require 'expressir/model/references/index_reference'
65
- require 'expressir/model/references/simple_reference'
66
- require 'expressir/model/statements/alias'
67
- require 'expressir/model/statements/assignment'
68
- require 'expressir/model/statements/case'
69
- require 'expressir/model/statements/case_action'
70
- require 'expressir/model/statements/compound'
71
- require 'expressir/model/statements/escape'
72
- require 'expressir/model/statements/if'
73
- require 'expressir/model/statements/null'
74
- require 'expressir/model/statements/procedure_call'
75
- require 'expressir/model/statements/repeat'
76
- require 'expressir/model/statements/return'
77
- require 'expressir/model/statements/skip'
78
- require 'expressir/model/supertype_expressions/binary_supertype_expression'
79
- require 'expressir/model/supertype_expressions/oneof_supertype_expression'
3
+ require "expressir/model/cache"
4
+ require "expressir/model/data_type"
5
+ require "expressir/model/declaration"
6
+ require "expressir/model/expression"
7
+ require "expressir/model/identifier"
8
+ require "expressir/model/literal"
9
+ require "expressir/model/reference"
10
+ require "expressir/model/repository"
11
+ require "expressir/model/statement"
12
+ require "expressir/model/supertype_expression"
13
+ require "expressir/model/data_types/aggregate"
14
+ require "expressir/model/data_types/array"
15
+ require "expressir/model/data_types/bag"
16
+ require "expressir/model/data_types/binary"
17
+ require "expressir/model/data_types/boolean"
18
+ require "expressir/model/data_types/enumeration"
19
+ require "expressir/model/data_types/enumeration_item"
20
+ require "expressir/model/data_types/generic_entity"
21
+ require "expressir/model/data_types/generic"
22
+ require "expressir/model/data_types/integer"
23
+ require "expressir/model/data_types/list"
24
+ require "expressir/model/data_types/logical"
25
+ require "expressir/model/data_types/number"
26
+ require "expressir/model/data_types/real"
27
+ require "expressir/model/data_types/set"
28
+ require "expressir/model/data_types/select"
29
+ require "expressir/model/data_types/string"
30
+ require "expressir/model/declarations/attribute"
31
+ require "expressir/model/declarations/constant"
32
+ require "expressir/model/declarations/entity"
33
+ require "expressir/model/declarations/function"
34
+ require "expressir/model/declarations/interface"
35
+ require "expressir/model/declarations/interface_item"
36
+ require "expressir/model/declarations/interfaced_item"
37
+ require "expressir/model/declarations/parameter"
38
+ require "expressir/model/declarations/procedure"
39
+ require "expressir/model/declarations/remark_item"
40
+ require "expressir/model/declarations/rule"
41
+ require "expressir/model/declarations/schema"
42
+ require "expressir/model/declarations/schema_version"
43
+ require "expressir/model/declarations/schema_version_item"
44
+ require "expressir/model/declarations/subtype_constraint"
45
+ require "expressir/model/declarations/type"
46
+ require "expressir/model/declarations/unique_rule"
47
+ require "expressir/model/declarations/variable"
48
+ require "expressir/model/declarations/where_rule"
49
+ require "expressir/model/expressions/aggregate_initializer"
50
+ require "expressir/model/expressions/aggregate_initializer_item"
51
+ require "expressir/model/expressions/binary_expression"
52
+ require "expressir/model/expressions/entity_constructor"
53
+ require "expressir/model/expressions/function_call"
54
+ require "expressir/model/expressions/interval"
55
+ require "expressir/model/expressions/query_expression"
56
+ require "expressir/model/expressions/unary_expression"
57
+ require "expressir/model/literals/binary"
58
+ require "expressir/model/literals/integer"
59
+ require "expressir/model/literals/logical"
60
+ require "expressir/model/literals/real"
61
+ require "expressir/model/literals/string"
62
+ require "expressir/model/references/attribute_reference"
63
+ require "expressir/model/references/group_reference"
64
+ require "expressir/model/references/index_reference"
65
+ require "expressir/model/references/simple_reference"
66
+ require "expressir/model/statements/alias"
67
+ require "expressir/model/statements/assignment"
68
+ require "expressir/model/statements/case"
69
+ require "expressir/model/statements/case_action"
70
+ require "expressir/model/statements/compound"
71
+ require "expressir/model/statements/escape"
72
+ require "expressir/model/statements/if"
73
+ require "expressir/model/statements/null"
74
+ require "expressir/model/statements/procedure_call"
75
+ require "expressir/model/statements/repeat"
76
+ require "expressir/model/statements/return"
77
+ require "expressir/model/statements/skip"
78
+ require "expressir/model/supertype_expressions/binary_supertype_expression"
79
+ require "expressir/model/supertype_expressions/oneof_supertype_expression"
@@ -1,3 +1,3 @@
1
1
  module Expressir
2
- VERSION = "1.2.3".freeze
2
+ VERSION = "1.2.6".freeze
3
3
  end
@@ -0,0 +1,161 @@
1
+ require "fileutils"
2
+ require "antlr4-native"
3
+ require "rake"
4
+
5
+ def create_class_declarations(parser_source_lines)
6
+ i = parser_source_lines.index { |x| x == "Class rb_cContextProxy;" }
7
+ parser_source_lines[i] += <<~CPP.split("\n").map { |x| x == "" ? x : x.to_s }.join("\n")
8
+
9
+ Class rb_cParserExt;
10
+ Class rb_cTokenExt;
11
+
12
+ CPP
13
+ end
14
+
15
+ def create_tp_class_definition(parser_source_lines)
16
+ i = parser_source_lines.index { |x| x == "class ContextProxy {" }
17
+ parser_source_lines[i - 2] += <<~CPP.split("\n").map { |x| x == "" ? x : x.to_s }.join("\n")
18
+
19
+
20
+ class TokenProxy : public Object {
21
+ public:
22
+ TokenProxy(Token* orig) {
23
+ this -> orig = orig;
24
+ }
25
+
26
+ std::string getText() {
27
+ return orig->getText();
28
+ }
29
+
30
+ size_t getChannel() {
31
+ return orig->getChannel();
32
+ }
33
+
34
+ size_t getTokenIndex() {
35
+ return orig->getTokenIndex();
36
+ }
37
+
38
+ private:
39
+ Token * orig = nullptr;
40
+ };
41
+
42
+ CPP
43
+ end
44
+
45
+ def create_pp_class_definition(parser_source_lines)
46
+ i = parser_source_lines.index { |x| x == "extern \"C\"" }
47
+ parser_source_lines[i - 2] += <<~CPP.split("\n").map { |x| x == "" ? x : x.to_s }.join("\n")
48
+
49
+ class ParserProxyExt : public Object {
50
+ public:
51
+ ParserProxyExt(Object self, string file) {
52
+ ifstream stream;
53
+ stream.open(file);
54
+ input = new ANTLRInputStream(stream);
55
+ lexer = new ExpressLexer(input);
56
+ tokens = new CommonTokenStream(lexer);
57
+ parser = new ExpressParser(tokens);
58
+ stream.close();
59
+ };
60
+
61
+ ~ParserProxyExt() {
62
+ delete parser;
63
+ delete tokens;
64
+ delete lexer;
65
+ delete input;
66
+ }
67
+
68
+ Object syntax() {
69
+ auto ctx = parser -> syntax();
70
+
71
+ SyntaxContextProxy proxy((ExpressParser::SyntaxContext*) ctx);
72
+ return detail::To_Ruby<SyntaxContextProxy>().convert(proxy);
73
+ }
74
+
75
+ Array getTokens() {
76
+ Array a;
77
+ for (auto token : tokens -> getTokens()) {
78
+ a.push(new TokenProxy(token));
79
+ }
80
+ return a;
81
+ }
82
+
83
+ Object visit(VisitorProxy* visitor) {
84
+ auto result = visitor -> visit(parser -> syntax());
85
+
86
+ lexer -> reset();
87
+ parser -> reset();
88
+
89
+ try {
90
+ return std::any_cast<Object>(result);
91
+ } catch(std::bad_cast) {
92
+ return Qnil;
93
+ }
94
+ }
95
+
96
+ private:
97
+ ANTLRInputStream* input;
98
+ ExpressLexer* lexer;
99
+ CommonTokenStream* tokens;
100
+ ExpressParser* parser;
101
+ };
102
+
103
+
104
+ CPP
105
+ end
106
+
107
+ def create_class_api(parser_source_lines)
108
+ i = parser_source_lines.index { |x| x == " .define_method(\"visit\", &ParserProxy::visit, Return().keepAlive());" }
109
+ parser_source_lines[i] += <<~CPP.split("\n").map { |x| x == "" ? x : " #{x}" }.join("\n")
110
+
111
+
112
+ rb_cTokenExt = define_class_under<TokenProxy>(rb_mExpressParser, "TokenExt")
113
+ .define_method("text", &TokenProxy::getText)
114
+ .define_method("channel", &TokenProxy::getChannel)
115
+ .define_method("token_index", &TokenProxy::getTokenIndex);
116
+
117
+ rb_cParserExt = define_class_under<ParserProxyExt>(rb_mExpressParser, "ParserExt")
118
+ .define_constructor(Constructor<ParserProxyExt, Object, string>())
119
+ .define_method("syntax", &ParserProxyExt::syntax, Return().keepAlive())
120
+ .define_method("tokens", &ParserProxyExt::getTokens)
121
+ .define_method("visit", &ParserProxyExt::visit, Return().keepAlive());
122
+
123
+ CPP
124
+ end
125
+
126
+ def generate_extended_parser
127
+ # Generate extended parser that provide Ruby access to token stream
128
+ parser_source_file = File.join("ext", "express-parser", "express_parser.cpp")
129
+ parser_source_lines = File.read(parser_source_file).split("\n")
130
+ create_class_declarations(parser_source_lines)
131
+ create_tp_class_definition(parser_source_lines)
132
+ create_pp_class_definition(parser_source_lines)
133
+ create_class_api(parser_source_lines)
134
+ File.write(parser_source_file, "#{parser_source_lines.join("\n")}\n")
135
+ end
136
+
137
+ desc "Generate parser (Usage: 'rake generate <grammar_file>')"
138
+ task "generate" do
139
+ grammar_file = ARGV[1]
140
+ if grammar_file.nil?
141
+ grammar_file = File.expand_path(File.join("..", "ext", "express-grammar", "Express.g4"), __dir__)
142
+ end
143
+
144
+ puts "Generating parser from '#{grammar_file}'"
145
+ # ANTLR does weird things if the grammar file isn't in the current working directory
146
+ temp_grammar_file = File.join(FileUtils.pwd, File.basename(grammar_file))
147
+ FileUtils.cp(grammar_file, temp_grammar_file)
148
+
149
+ # generate parser
150
+ generator = Antlr4Native::Generator.new(
151
+ grammar_files: [File.basename(temp_grammar_file)],
152
+ output_dir: "ext",
153
+ parser_root_method: "syntax",
154
+ )
155
+ generator.generate
156
+
157
+ puts "Generating extended parser"
158
+ generate_extended_parser
159
+ # cleanup
160
+ FileUtils.rm(temp_grammar_file)
161
+ end