rley 0.8.00 → 0.8.05

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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +47 -3
  3. data/CHANGELOG.md +32 -4
  4. data/examples/NLP/pico_en_demo.rb +2 -2
  5. data/examples/data_formats/JSON/README.md +34 -0
  6. data/examples/data_formats/JSON/sample01.json +3 -0
  7. data/examples/data_formats/JSON/sample01.svg +36 -0
  8. data/examples/data_formats/JSON/sample02.json +6 -0
  9. data/examples/data_formats/JSON/sample02.svg +128 -0
  10. data/examples/data_formats/JSON/sample03.json +88 -0
  11. data/examples/general/calc_iter1/README.md +26 -0
  12. data/examples/general/calc_iter2/README.md +55 -0
  13. data/examples/general/general_examples.md +37 -0
  14. data/examples/tokenizer/README.md +46 -0
  15. data/examples/tokenizer/loxxy_raw_scanner.rex +98 -0
  16. data/examples/tokenizer/loxxy_raw_scanner.rex.rb +256 -0
  17. data/examples/tokenizer/loxxy_tokenizer.rb +94 -0
  18. data/examples/tokenizer/run_tokenizer.rb +29 -0
  19. data/lib/rley/constants.rb +1 -1
  20. data/lib/rley/lexical/literal.rb +29 -0
  21. data/lib/rley/lexical/token.rb +7 -4
  22. data/lib/rley/notation/all_notation_nodes.rb +3 -1
  23. data/lib/rley/notation/ast_builder.rb +185 -191
  24. data/lib/rley/notation/ast_node.rb +5 -5
  25. data/lib/rley/notation/ast_visitor.rb +3 -1
  26. data/lib/rley/notation/grammar.rb +1 -1
  27. data/lib/rley/notation/grammar_builder.rb +87 -33
  28. data/lib/rley/notation/grouping_node.rb +1 -1
  29. data/lib/rley/notation/parser.rb +56 -56
  30. data/lib/rley/notation/sequence_node.rb +3 -3
  31. data/lib/rley/notation/symbol_node.rb +2 -2
  32. data/lib/rley/notation/tokenizer.rb +3 -15
  33. data/lib/rley/parse_rep/ast_base_builder.rb +35 -4
  34. data/lib/rley/parser/gfg_chart.rb +5 -4
  35. data/lib/rley/parser/gfg_earley_parser.rb +1 -1
  36. data/lib/rley/syntax/base_grammar_builder.rb +8 -2
  37. data/lib/rley/syntax/match_closest.rb +7 -7
  38. data/lib/rley.rb +1 -1
  39. data/spec/rley/lexical/literal_spec.rb +33 -0
  40. data/spec/rley/lexical/token_spec.rb +15 -4
  41. data/spec/rley/notation/grammar_builder_spec.rb +57 -50
  42. data/spec/rley/notation/parser_spec.rb +183 -184
  43. data/spec/rley/notation/tokenizer_spec.rb +98 -104
  44. data/spec/rley/parser/dangling_else_spec.rb +20 -20
  45. data/spec/rley/parser/gfg_chart_spec.rb +0 -1
  46. data/spec/rley/parser/gfg_earley_parser_spec.rb +166 -147
  47. data/spec/rley/parser/gfg_parsing_spec.rb +2 -2
  48. data/spec/rley/syntax/base_grammar_builder_spec.rb +7 -8
  49. data/spec/rley/syntax/grammar_spec.rb +6 -9
  50. data/spec/rley/syntax/match_closest_spec.rb +4 -4
  51. metadata +19 -9
  52. data/lib/rley/parser/parse_tracer.rb +0 -103
  53. data/lib/rley/syntax/literal.rb +0 -20
  54. data/lib/rley/syntax/verbatim_symbol.rb +0 -27
  55. data/spec/rley/syntax/literal_spec.rb +0 -31
  56. data/spec/rley/syntax/verbatim_symbol_spec.rb +0 -38
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ee99e1b9803a447d18a3f82e91353659e211109a5fb99d48a834ddebf572998f
4
- data.tar.gz: f4719d9fa301a0de2be143ca0aa5d0c261cf1562194a40b038c79b1faa1c04dc
3
+ metadata.gz: a94c23265bf2996856da4d4b1fc6f2749873626951d30bacec9f1ca7619d4d4f
4
+ data.tar.gz: fc6a6ae19388b532dc711915a9c33ffc455a602ea9e6a1ae13e53522bc0616d0
5
5
  SHA512:
6
- metadata.gz: 9810a2d3884f86d2d437e1ba0911681f53895ff60ef500e4d19bd5d9429ff433f46c1dd57d6e185eb0bce3fcf869b1e4884acd09aaff72aee0323d00a781e763
7
- data.tar.gz: e7d49393824bbbeaff70bc7d57137d1fe82f86a98bfda52fc9144dbafa3e5568e51ce7e9da8c15fc2f51438b29100801e8ea145f613165ba4369093f07bfad23
6
+ metadata.gz: 9b25f6a34e4e5603d4b88f5cf3220e998d9e0c38ffef204ebbf4a8eacaf57853c2bb9bc2bb5a3765440aaed41ee5a4883edadc533c6df0dc907b58457b085469
7
+ data.tar.gz: 57c3021f24eb5764fef2be6bdd58a9cda1c9b9343737c357d6c1e1862beceaf041ed9eee9fb625cf9acc9492bac0fcb6a6ac8cd9dc464dcf2096fccd5b51e6e9
data/.rubocop.yml CHANGED
@@ -1,7 +1,6 @@
1
1
  AllCops:
2
2
  Exclude:
3
3
  - 'exp/**/*'
4
- - 'demo/**/*'
5
4
 
6
5
  Gemspec/DateAssignment:
7
6
  Enabled: true
@@ -50,6 +49,9 @@ Layout/IndentationConsistency:
50
49
  Layout/HeredocIndentation:
51
50
  Enabled: false
52
51
 
52
+ Layout/LineEndStringConcatenationIndentation:
53
+ Enabled: true
54
+
53
55
  Layout/MultilineHashBraceLayout:
54
56
  Enabled: true
55
57
 
@@ -78,9 +80,15 @@ Layout/TrailingEmptyLines:
78
80
  Layout/TrailingWhitespace:
79
81
  Enabled: true
80
82
 
83
+ Lint/AmbiguousOperatorPrecedence:
84
+ Enabled: true
85
+
81
86
  Lint/AmbiguousAssignment:
82
87
  Enabled: true
83
88
 
89
+ Lint/AmbiguousRange:
90
+ Enabled: true
91
+
84
92
  Lint/DeprecatedConstants:
85
93
  Enabled: true
86
94
 
@@ -96,6 +104,12 @@ Lint/EmptyBlock:
96
104
  Lint/EmptyClass:
97
105
  Enabled: false
98
106
 
107
+ Lint/EmptyInPattern:
108
+ Enabled: true
109
+
110
+ Lint/IncompatibleIoSelectWithFiberScheduler:
111
+ Enabled: true
112
+
99
113
  Lint/LambdaWithoutLiteralBlock:
100
114
  Enabled: true
101
115
 
@@ -117,6 +131,9 @@ Lint/RaiseException:
117
131
  Lint/RedundantDirGlobSort:
118
132
  Enabled: true
119
133
 
134
+ Lint/RequireRelativeSelfPath:
135
+ Enabled: true
136
+
120
137
  Lint/RescueException:
121
138
  Enabled: true
122
139
 
@@ -192,6 +209,9 @@ Naming/ClassAndModuleCamelCase:
192
209
  Naming/BlockParameterName:
193
210
  Enabled: true
194
211
 
212
+ Naming/InclusiveLanguage:
213
+ Enabled: true
214
+
195
215
  Naming/MethodParameterName:
196
216
  Enabled: false
197
217
 
@@ -201,8 +221,8 @@ Naming/MethodName:
201
221
  Naming/VariableName:
202
222
  Enabled: false
203
223
 
204
- Style/AccessorGrouping:
205
- Enabled: false
224
+ Security/IoMethods:
225
+ Enabled: true
206
226
 
207
227
  Style/Alias:
208
228
  Enabled: true
@@ -276,12 +296,18 @@ Style/HashTransformValues:
276
296
  Style/IfUnlessModifier:
277
297
  Enabled: false
278
298
 
299
+ Style/InPatternThen:
300
+ Enabled: true
301
+
279
302
  Style/InverseMethods:
280
303
  Enabled: false
281
304
 
282
305
  Style/MissingRespondToMissing:
283
306
  Enabled: false
284
307
 
308
+ Style/MultilineInPatternThen:
309
+ Enabled: true
310
+
285
311
  Style/NegatedIfElseCondition:
286
312
  Enabled: true
287
313
 
@@ -291,9 +317,18 @@ Style/Next:
291
317
  Style/NilLambda:
292
318
  Enabled: true
293
319
 
320
+ Style/NumberedParameters:
321
+ Enabled: true
322
+
323
+ Style/NumberedParametersLimit:
324
+ Enabled: true
325
+
294
326
  Style/NumericLiterals:
295
327
  Enabled: false
296
328
 
329
+ Style/QuotedSymbols:
330
+ Enabled: true
331
+
297
332
  Style/RaiseArgs:
298
333
  Enabled: true
299
334
 
@@ -306,11 +341,17 @@ Style/RedundantReturn:
306
341
  Style/RedundantSelf:
307
342
  Enabled: true
308
343
 
344
+ Style/RedundantSelfAssignmentBranch:
345
+ Enabled: true
346
+
309
347
  Style/RegexpLiteral:
310
348
  Enabled: false
311
349
 
312
350
  Style/PercentLiteralDelimiters:
313
351
  Enabled: false
352
+
353
+ Style/SelectByRegexp:
354
+ Enabled: true
314
355
 
315
356
  Style/StderrPuts:
316
357
  Enabled: false
@@ -367,6 +408,9 @@ Lint/TopLevelReturnWithArgument:
367
408
  Lint/UnreachableLoop:
368
409
  Enabled: true
369
410
 
411
+ Style/AccessorGrouping:
412
+ Enabled: true
413
+
370
414
  Style/ArrayCoercion:
371
415
  Enabled: true
372
416
 
data/CHANGELOG.md CHANGED
@@ -1,3 +1,31 @@
1
+ ### 0.8.05 / 2021-10-04
2
+ - Added example of generated scanner. Unused class removal, code re-styling to please `Rubocop`
3
+
4
+ * [NEW] Folder `example\tokenizer` contains an example with a scanner that was generated.
5
+ * [NEW] Class `Rley::Lexical::Literal` a specialization of Token class for literal tokens.
6
+ * [CHANGE] File `.rubocp.yml` updated to take into account new 1.21 and 1.22 cops.
7
+ * [DELETED] Class `Rley::Parser::ParserTracer` this class was no more in use.
8
+ * [DELETED] Class `Rley::Syntax::Literal` this class was unused.
9
+ * [DELETED] Class `Rley::Syntax::VerbatimSymbol` this class was unused.
10
+
11
+ ### 0.8.03 / 2021-08-27
12
+ - Added missing method in `ASTBaseBuilder` class
13
+
14
+ * [FIX] Added method `ParseRep::ASTBaseBuilder#reduce_children`.
15
+
16
+ ### 0.8.02 / 2021-08-23
17
+ - Code restyling to please Rubocop 1.19.1
18
+
19
+ * [CHANGE] File `.rubocp.yml` updated to take into account new cops.
20
+ * [CHANGE] File `*.rb` files updated to fix Rubocop findings
21
+
22
+
23
+ ### 0.8.01 / 2021-08-22
24
+ - Unused/redundant file removal. Fix in rule generation
25
+
26
+ * [CHANGE] Removal of files in repository that were redundant/useless.
27
+ * [FIX] The rule ordering was broken by the rules implicitly generated by Rlry
28
+
1
29
  ### 0.8.00 / 2021-08-15
2
30
  - New grammar builder that accepts ? * + modifiers
3
31
 
@@ -15,10 +43,10 @@
15
43
  - [FIX] Method `GFGParsing#nullable_rule`: issue with nullable productions having at least one member in their rhs.
16
44
 
17
45
  ### 0.7.04 / 2019-08-17
18
- - Rley recognizer is about 25% faster than previous version. Kudos to the people
19
- behind the *magic_frozen_string_literal* gem.
46
+ - Rley recognizer is about 25% faster than previous version. Kudos to the people
47
+ behind the *magic_frozen_string_literal* gem.
20
48
  - Code refactoring to use string frozen magic comments (as a consequence, Rley runs only on Rubies 2.3 or newer).
21
- - Code restyling to please rubocop 0.7.40.
49
+ - Code restyling to please rubocop 0.7.40.
22
50
  - [CHANGE] Class `ParseEntrySet`: minor code optimization
23
51
  - [CHANGE] File `README.md` removed allusion to Ruby 2.0.x up to 2.2.x.
24
52
  - [CHANGE] File `README.md` added Ruby 2.6.x up as supported version.
@@ -103,7 +131,7 @@ behind the *magic_frozen_string_literal* gem.
103
131
  * [FIX] Code re-styling to remove most style offenses found by Rubocop 0.52.1
104
132
 
105
133
  ### 0.6.00 / 2018-02-25
106
- Version bump. Highlights: new programming interface through facade object, improved AST generation.
134
+ Version bump. Highlights: new programming interface through facade object, improved AST generation.
107
135
  * [NEW] Class `Rley::Engine`: Implementation of Facade design pattern to reach more convenient interface.
108
136
  * [NEW] Class `Rley::ParseRep::ASTBaseBuilder` Abstract class that simplifies the creation of custom AST (Abstract Syntax Tree)
109
137
  * [NEW] Module `Rley::ParseRep` hosts the classes for building parse representations (parse trees and forests)
@@ -26,8 +26,8 @@ engine.build_grammar do
26
26
  rule 'S' => 'NP VP'
27
27
  rule 'NP' => 'Proper-Noun'
28
28
  rule 'NP' => 'Determiner Noun'
29
- rule 'NP' => 'Determiner Noun PP'
30
- rule 'VP' => 'Verb NP'
29
+ rule 'NP' => 'Determiner Noun PP'
30
+ rule 'VP' => 'Verb NP'
31
31
  rule 'VP' => 'Verb NP PP'
32
32
  rule 'PP' => 'Preposition NP'
33
33
  end
@@ -0,0 +1,34 @@
1
+ ## Demo JSON parser
2
+
3
+ ### Source files
4
+ This sample project consists of the following files:
5
+ - **cli_opt.rb** containing the utility class `CLIOptions` that retrieves the
6
+ command-line options.
7
+
8
+ - **json_ast_builder.rb** containing the class `JSONASTBuilder` that creates
9
+ the abstract syntax trees (AST) representation for a given parse result.
10
+
11
+ - **json_ast_nodes.rb** containing the node classs for implementing the AST.
12
+ The nodes are augmented with methods that allow the re-use of some formatters
13
+ designed initially for CST (Concrete Syntax Tree). The nodes have a 'to_ruby'
14
+ method that enable a conversion of the input JSON text into Ruby representation.
15
+
16
+ - **JSON_demo.rb** a demo command-line program.
17
+ It parses the JSON file specified in the command-line and outputs the parse tree
18
+ into different formats. For more details, run the command-line: `JSON_demo.rb --help`
19
+
20
+ - **JSON_grammar.rb** implementing the class `JSONGrammar`.
21
+ The grammar is a list of (production) rules that specifies the syntax of JSON data.
22
+ A little examination of the grammar will reveal interesting grammar features such as:
23
+ * Recursive rules (e.g. terminal in left-side of rule also appears in right-hand side)
24
+
25
+ - **JSON_lexer.rb** implementing the class `JSONLexer`.
26
+ The purpose of the lexer is to break the JSON source text into a sequence of tokens.
27
+
28
+ - **JSON_parser.rb** implementing a `JSONParser` class.
29
+ The parser processes the tokens stream from the lexer and delivers its results
30
+
31
+
32
+ - sample0x.json files of various degree of complexity.
33
+
34
+ - sample0x.svg files that are syntax tree diagrams obtained by feeding [RSyntaxTree](http://yohasebe.com/rsyntaxtree/) with the output of JSON_demo.rb. Remark: the website works best with not too complex parse trees.
@@ -0,0 +1,3 @@
1
+ {
2
+ "name" : "John Doe"
3
+ }
@@ -0,0 +1,36 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
3
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg width="469.5" height="502" version="1.1" xmlns="http://www.w3.org/2000/svg">
5
+ <text style='fill: green; font-size: 16px;' x='296.53125' y='490'> John Doe</text>
6
+ <text style='fill: green; font-size: 16px;' x='109.53125' y='424'> name</text>
7
+ <text style='fill: green; font-size: 16px;' x='221.2421875' y='424'> :</text>
8
+ <text style='fill: blue; font-size: 16px;' x='309.3828125' y='424'>string</text>
9
+ <polygon style='fill: white; stroke: black; stroke-width:1;' points='361 467 297 467 329 431' />
10
+ <text style='fill: blue; font-size: 16px;' x='109.796875' y='358'>string</text>
11
+ <line style='stroke:black; stroke-width:1;' x1='130' y1='401' x2='130' y2='365' />
12
+ <text style='fill: blue; font-size: 16px;' x='164.796875' y='358'>name-separator</text>
13
+ <line style='stroke:black; stroke-width:1;' x1='223' y1='401' x2='223' y2='365' />
14
+ <text style='fill: blue; font-size: 16px;' x='309.75' y='358'>value</text>
15
+ <line style='stroke:black; stroke-width:1;' x1='329' y1='401' x2='329' y2='365' />
16
+ <text style='fill: green; font-size: 16px;' x='46.5078125' y='292'> {</text>
17
+ <text style='fill: blue; font-size: 16px;' x='198.40234375' y='292'>member</text>
18
+ <line style='stroke:black; stroke-width:1;' x1='130' y1='335' x2='229' y2='299' />
19
+ <line style='stroke:black; stroke-width:1;' x1='223' y1='335' x2='229' y2='299' />
20
+ <line style='stroke:black; stroke-width:1;' x1='329' y1='335' x2='229' y2='299' />
21
+ <text style='fill: green; font-size: 16px;' x='412.4375' y='292'> }</text>
22
+ <text style='fill: blue; font-size: 16px;' x='5.0' y='226'>begin-object</text>
23
+ <line style='stroke:black; stroke-width:1;' x1='50' y1='269' x2='50' y2='233' />
24
+ <text style='fill: blue; font-size: 16px;' x='185.58984375' y='226'>member-list</text>
25
+ <line style='stroke:black; stroke-width:1;' x1='229' y1='269' x2='229' y2='233' />
26
+ <text style='fill: blue; font-size: 16px;' x='376.96875' y='226'>end-object</text>
27
+ <line style='stroke:black; stroke-width:1;' x1='416' y1='269' x2='416' y2='233' />
28
+ <text style='fill: blue; font-size: 16px;' x='209.984375' y='160'>object</text>
29
+ <line style='stroke:black; stroke-width:1;' x1='50' y1='203' x2='233' y2='167' />
30
+ <line style='stroke:black; stroke-width:1;' x1='229' y1='203' x2='233' y2='167' />
31
+ <line style='stroke:black; stroke-width:1;' x1='416' y1='203' x2='233' y2='167' />
32
+ <text style='fill: blue; font-size: 16px;' x='213.25' y='94'>value</text>
33
+ <line style='stroke:black; stroke-width:1;' x1='233' y1='137' x2='233' y2='101' />
34
+ <text style='fill: blue; font-size: 16px;' x='197.03125' y='28'>JSON-text</text>
35
+ <line style='stroke:black; stroke-width:1;' x1='233' y1='71' x2='233' y2='35' />
36
+ </svg>
@@ -0,0 +1,6 @@
1
+ {
2
+ "id": 1,
3
+ "name": "A green door",
4
+ "price": 12.50,
5
+ "tags": ["home", "green"]
6
+ }
@@ -0,0 +1,128 @@
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
3
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg width="2060.15625" height="766" version="1.1" xmlns="http://www.w3.org/2000/svg">
5
+ <text style='fill: green; font-size: 16px;' x='1597.078125' y='754'> home</text>
6
+ <text style='fill: green; font-size: 16px;' x='320.75' y='688'> 1</text>
7
+ <text style='fill: blue; font-size: 16px;' x='1597.265625' y='688'>string</text>
8
+ <line style='stroke:black; stroke-width:1;' x1='1617' y1='731' x2='1617' y2='695' />
9
+ <text style='fill: green; font-size: 16px;' x='1825.0' y='688'> green</text>
10
+ <text style='fill: green; font-size: 16px;' x='122.84375' y='622'> id</text>
11
+ <text style='fill: green; font-size: 16px;' x='220.7109375' y='622'> :</text>
12
+ <text style='fill: blue; font-size: 16px;' x='296.0' y='622'>number</text>
13
+ <line style='stroke:black; stroke-width:1;' x1='325' y1='665' x2='325' y2='629' />
14
+ <text style='fill: green; font-size: 16px;' x='685.109375' y='622'> A green door</text>
15
+ <text style='fill: blue; font-size: 16px;' x='1597.6328125' y='622'>value</text>
16
+ <line style='stroke:black; stroke-width:1;' x1='1617' y1='665' x2='1617' y2='629' />
17
+ <text style='fill: green; font-size: 16px;' x='1750.75' y='622'> ,</text>
18
+ <text style='fill: blue; font-size: 16px;' x='1825.984375' y='622'>string</text>
19
+ <line style='stroke:black; stroke-width:1;' x1='1846' y1='665' x2='1846' y2='629' />
20
+ <text style='fill: blue; font-size: 16px;' x='109.53125' y='556'>string</text>
21
+ <line style='stroke:black; stroke-width:1;' x1='129' y1='599' x2='129' y2='563' />
22
+ <text style='fill: blue; font-size: 16px;' x='164.265625' y='556'>name-separator</text>
23
+ <line style='stroke:black; stroke-width:1;' x1='223' y1='599' x2='223' y2='563' />
24
+ <text style='fill: blue; font-size: 16px;' x='305.0546875' y='556'>value</text>
25
+ <line style='stroke:black; stroke-width:1;' x1='325' y1='599' x2='325' y2='563' />
26
+ <text style='fill: green; font-size: 16px;' x='498.109375' y='556'> name</text>
27
+ <text style='fill: green; font-size: 16px;' x='609.8203125' y='556'> :</text>
28
+ <text style='fill: blue; font-size: 16px;' x='712.2421875' y='556'>string</text>
29
+ <polygon style='fill: white; stroke: black; stroke-width:1;' points='779 599 686 599 732 563' />
30
+ <text style='fill: green; font-size: 16px;' x='1119.0078125' y='556'> 12.50</text>
31
+ <text style='fill: green; font-size: 16px;' x='1538.2578125' y='556'> [</text>
32
+ <text style='fill: blue; font-size: 16px;' x='1575.671875' y='556'>array-items</text>
33
+ <line style='stroke:black; stroke-width:1;' x1='1617' y1='599' x2='1617' y2='563' />
34
+ <text style='fill: blue; font-size: 16px;' x='1695.0' y='556'>value-separator</text>
35
+ <line style='stroke:black; stroke-width:1;' x1='1752' y1='599' x2='1752' y2='563' />
36
+ <text style='fill: blue; font-size: 16px;' x='1826.3515625' y='556'>value</text>
37
+ <line style='stroke:black; stroke-width:1;' x1='1846' y1='599' x2='1846' y2='563' />
38
+ <text style='fill: green; font-size: 16px;' x='1914.8671875' y='556'> ]</text>
39
+ <text style='fill: blue; font-size: 16px;' x='195.921875' y='490'>member</text>
40
+ <line style='stroke:black; stroke-width:1;' x1='129' y1='533' x2='227' y2='497' />
41
+ <line style='stroke:black; stroke-width:1;' x1='223' y1='533' x2='227' y2='497' />
42
+ <line style='stroke:black; stroke-width:1;' x1='325' y1='533' x2='227' y2='497' />
43
+ <text style='fill: green; font-size: 16px;' x='423.859375' y='490'> ,</text>
44
+ <text style='fill: blue; font-size: 16px;' x='498.375' y='490'>string</text>
45
+ <line style='stroke:black; stroke-width:1;' x1='518' y1='533' x2='518' y2='497' />
46
+ <text style='fill: blue; font-size: 16px;' x='553.375' y='490'>name-separator</text>
47
+ <line style='stroke:black; stroke-width:1;' x1='612' y1='533' x2='612' y2='497' />
48
+ <text style='fill: blue; font-size: 16px;' x='712.609375' y='490'>value</text>
49
+ <line style='stroke:black; stroke-width:1;' x1='732' y1='533' x2='732' y2='497' />
50
+ <text style='fill: green; font-size: 16px;' x='926.921875' y='490'> price</text>
51
+ <text style='fill: green; font-size: 16px;' x='1035.2890625' y='490'> :</text>
52
+ <text style='fill: blue; font-size: 16px;' x='1110.578125' y='490'>number</text>
53
+ <line style='stroke:black; stroke-width:1;' x1='1139' y1='533' x2='1139' y2='497' />
54
+ <text style='fill: blue; font-size: 16px;' x='1499.15625' y='490'>begin-array</text>
55
+ <line style='stroke:black; stroke-width:1;' x1='1541' y1='533' x2='1541' y2='497' />
56
+ <text style='fill: blue; font-size: 16px;' x='1690.03125' y='490'>array-items</text>
57
+ <line style='stroke:black; stroke-width:1;' x1='1617' y1='533' x2='1731' y2='497' />
58
+ <line style='stroke:black; stroke-width:1;' x1='1752' y1='533' x2='1731' y2='497' />
59
+ <line style='stroke:black; stroke-width:1;' x1='1846' y1='533' x2='1731' y2='497' />
60
+ <text style='fill: blue; font-size: 16px;' x='1881.703125' y='490'>end-array</text>
61
+ <line style='stroke:black; stroke-width:1;' x1='1917' y1='533' x2='1917' y2='497' />
62
+ <text style='fill: blue; font-size: 16px;' x='183.109375' y='424'>member-list</text>
63
+ <line style='stroke:black; stroke-width:1;' x1='227' y1='467' x2='227' y2='431' />
64
+ <text style='fill: blue; font-size: 16px;' x='368.109375' y='424'>value-separator</text>
65
+ <line style='stroke:black; stroke-width:1;' x1='426' y1='467' x2='426' y2='431' />
66
+ <text style='fill: blue; font-size: 16px;' x='594.12109375' y='424'>member</text>
67
+ <line style='stroke:black; stroke-width:1;' x1='518' y1='467' x2='625' y2='431' />
68
+ <line style='stroke:black; stroke-width:1;' x1='612' y1='467' x2='625' y2='431' />
69
+ <line style='stroke:black; stroke-width:1;' x1='732' y1='467' x2='625' y2='431' />
70
+ <text style='fill: green; font-size: 16px;' x='849.859375' y='424'> ,</text>
71
+ <text style='fill: blue; font-size: 16px;' x='924.109375' y='424'>string</text>
72
+ <line style='stroke:black; stroke-width:1;' x1='944' y1='467' x2='944' y2='431' />
73
+ <text style='fill: blue; font-size: 16px;' x='978.84375' y='424'>name-separator</text>
74
+ <line style='stroke:black; stroke-width:1;' x1='1037' y1='467' x2='1037' y2='431' />
75
+ <text style='fill: blue; font-size: 16px;' x='1119.6328125' y='424'>value</text>
76
+ <line style='stroke:black; stroke-width:1;' x1='1139' y1='467' x2='1139' y2='431' />
77
+ <text style='fill: green; font-size: 16px;' x='1317.6875' y='424'> tags</text>
78
+ <text style='fill: green; font-size: 16px;' x='1423.8671875' y='424'> :</text>
79
+ <text style='fill: blue; font-size: 16px;' x='1709.4296875' y='424'>array</text>
80
+ <line style='stroke:black; stroke-width:1;' x1='1541' y1='467' x2='1729' y2='431' />
81
+ <line style='stroke:black; stroke-width:1;' x1='1731' y1='467' x2='1729' y2='431' />
82
+ <line style='stroke:black; stroke-width:1;' x1='1917' y1='467' x2='1729' y2='431' />
83
+ <text style='fill: blue; font-size: 16px;' x='382.208984375' y='358'>member-list</text>
84
+ <line style='stroke:black; stroke-width:1;' x1='227' y1='401' x2='426' y2='365' />
85
+ <line style='stroke:black; stroke-width:1;' x1='426' y1='401' x2='426' y2='365' />
86
+ <line style='stroke:black; stroke-width:1;' x1='625' y1='401' x2='426' y2='365' />
87
+ <text style='fill: blue; font-size: 16px;' x='794.109375' y='358'>value-separator</text>
88
+ <line style='stroke:black; stroke-width:1;' x1='852' y1='401' x2='852' y2='365' />
89
+ <text style='fill: blue; font-size: 16px;' x='1010.5' y='358'>member</text>
90
+ <line style='stroke:black; stroke-width:1;' x1='944' y1='401' x2='1042' y2='365' />
91
+ <line style='stroke:black; stroke-width:1;' x1='1037' y1='401' x2='1042' y2='365' />
92
+ <line style='stroke:black; stroke-width:1;' x1='1139' y1='401' x2='1042' y2='365' />
93
+ <text style='fill: green; font-size: 16px;' x='1238.4375' y='358'> ,</text>
94
+ <text style='fill: blue; font-size: 16px;' x='1312.6875' y='358'>string</text>
95
+ <line style='stroke:black; stroke-width:1;' x1='1333' y1='401' x2='1333' y2='365' />
96
+ <text style='fill: blue; font-size: 16px;' x='1367.421875' y='358'>name-separator</text>
97
+ <line style='stroke:black; stroke-width:1;' x1='1426' y1='401' x2='1426' y2='365' />
98
+ <text style='fill: blue; font-size: 16px;' x='1709.390625' y='358'>value</text>
99
+ <line style='stroke:black; stroke-width:1;' x1='1729' y1='401' x2='1729' y2='365' />
100
+ <text style='fill: green; font-size: 16px;' x='46.5078125' y='292'> {</text>
101
+ <text style='fill: blue; font-size: 16px;' x='689.9482421875' y='292'>member-list</text>
102
+ <line style='stroke:black; stroke-width:1;' x1='426' y1='335' x2='734' y2='299' />
103
+ <line style='stroke:black; stroke-width:1;' x1='852' y1='335' x2='734' y2='299' />
104
+ <line style='stroke:black; stroke-width:1;' x1='1042' y1='335' x2='734' y2='299' />
105
+ <text style='fill: blue; font-size: 16px;' x='1182.6875' y='292'>value-separator</text>
106
+ <line style='stroke:black; stroke-width:1;' x1='1240' y1='335' x2='1240' y2='299' />
107
+ <text style='fill: blue; font-size: 16px;' x='1499.66796875' y='292'>member</text>
108
+ <line style='stroke:black; stroke-width:1;' x1='1333' y1='335' x2='1531' y2='299' />
109
+ <line style='stroke:black; stroke-width:1;' x1='1426' y1='335' x2='1531' y2='299' />
110
+ <line style='stroke:black; stroke-width:1;' x1='1729' y1='335' x2='1531' y2='299' />
111
+ <text style='fill: green; font-size: 16px;' x='2003.09375' y='292'> }</text>
112
+ <text style='fill: blue; font-size: 16px;' x='5.0' y='226'>begin-object</text>
113
+ <line style='stroke:black; stroke-width:1;' x1='50' y1='269' x2='50' y2='233' />
114
+ <text style='fill: blue; font-size: 16px;' x='1088.40185546875' y='226'>member-list</text>
115
+ <line style='stroke:black; stroke-width:1;' x1='734' y1='269' x2='1132' y2='233' />
116
+ <line style='stroke:black; stroke-width:1;' x1='1240' y1='269' x2='1132' y2='233' />
117
+ <line style='stroke:black; stroke-width:1;' x1='1531' y1='269' x2='1132' y2='233' />
118
+ <text style='fill: blue; font-size: 16px;' x='1967.625' y='226'>end-object</text>
119
+ <line style='stroke:black; stroke-width:1;' x1='2006' y1='269' x2='2006' y2='233' />
120
+ <text style='fill: blue; font-size: 16px;' x='1005.3125' y='160'>object</text>
121
+ <line style='stroke:black; stroke-width:1;' x1='50' y1='203' x2='1028' y2='167' />
122
+ <line style='stroke:black; stroke-width:1;' x1='1132' y1='203' x2='1028' y2='167' />
123
+ <line style='stroke:black; stroke-width:1;' x1='2006' y1='203' x2='1028' y2='167' />
124
+ <text style='fill: blue; font-size: 16px;' x='1008.578125' y='94'>value</text>
125
+ <line style='stroke:black; stroke-width:1;' x1='1028' y1='137' x2='1028' y2='101' />
126
+ <text style='fill: blue; font-size: 16px;' x='992.359375' y='28'>JSON-text</text>
127
+ <line style='stroke:black; stroke-width:1;' x1='1028' y1='71' x2='1028' y2='35' />
128
+ </svg>
@@ -0,0 +1,88 @@
1
+ {"web-app": {
2
+ "servlet": [
3
+ {
4
+ "servlet-name": "cofaxCDS",
5
+ "servlet-class": "org.cofax.cds.CDSServlet",
6
+ "init-param": {
7
+ "configGlossary:installationAt": "Philadelphia, PA",
8
+ "configGlossary:adminEmail": "ksm@pobox.com",
9
+ "configGlossary:poweredBy": "Cofax",
10
+ "configGlossary:poweredByIcon": "/images/cofax.gif",
11
+ "configGlossary:staticPath": "/content/static",
12
+ "templateProcessorClass": "org.cofax.WysiwygTemplate",
13
+ "templateLoaderClass": "org.cofax.FilesTemplateLoader",
14
+ "templatePath": "templates",
15
+ "templateOverridePath": "",
16
+ "defaultListTemplate": "listTemplate.htm",
17
+ "defaultFileTemplate": "articleTemplate.htm",
18
+ "useJSP": false,
19
+ "jspListTemplate": "listTemplate.jsp",
20
+ "jspFileTemplate": "articleTemplate.jsp",
21
+ "cachePackageTagsTrack": 200,
22
+ "cachePackageTagsStore": 200,
23
+ "cachePackageTagsRefresh": 60,
24
+ "cacheTemplatesTrack": 100,
25
+ "cacheTemplatesStore": 50,
26
+ "cacheTemplatesRefresh": 15,
27
+ "cachePagesTrack": 200,
28
+ "cachePagesStore": 100,
29
+ "cachePagesRefresh": 10,
30
+ "cachePagesDirtyRead": 10,
31
+ "searchEngineListTemplate": "forSearchEnginesList.htm",
32
+ "searchEngineFileTemplate": "forSearchEngines.htm",
33
+ "searchEngineRobotsDb": "WEB-INF/robots.db",
34
+ "useDataStore": true,
35
+ "dataStoreClass": "org.cofax.SqlDataStore",
36
+ "redirectionClass": "org.cofax.SqlRedirection",
37
+ "dataStoreName": "cofax",
38
+ "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver",
39
+ "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon",
40
+ "dataStoreUser": "sa",
41
+ "dataStorePassword": "dataStoreTestQuery",
42
+ "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';",
43
+ "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log",
44
+ "dataStoreInitConns": 10,
45
+ "dataStoreMaxConns": 100,
46
+ "dataStoreConnUsageLimit": 100,
47
+ "dataStoreLogLevel": "debug",
48
+ "maxUrlLength": 500}},
49
+ {
50
+ "servlet-name": "cofaxEmail",
51
+ "servlet-class": "org.cofax.cds.EmailServlet",
52
+ "init-param": {
53
+ "mailHost": "mail1",
54
+ "mailHostOverride": "mail2"}},
55
+ {
56
+ "servlet-name": "cofaxAdmin",
57
+ "servlet-class": "org.cofax.cds.AdminServlet"},
58
+
59
+ {
60
+ "servlet-name": "fileServlet",
61
+ "servlet-class": "org.cofax.cds.FileServlet"},
62
+ {
63
+ "servlet-name": "cofaxTools",
64
+ "servlet-class": "org.cofax.cms.CofaxToolsServlet",
65
+ "init-param": {
66
+ "templatePath": "toolstemplates/",
67
+ "log": 1,
68
+ "logLocation": "/usr/local/tomcat/logs/CofaxTools.log",
69
+ "logMaxSize": "",
70
+ "dataLog": 1,
71
+ "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log",
72
+ "dataLogMaxSize": "",
73
+ "removePageCache": "/content/admin/remove?cache=pages&id=",
74
+ "removeTemplateCache": "/content/admin/remove?cache=templates&id=",
75
+ "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder",
76
+ "lookInContext": 1,
77
+ "adminGroupID": 4,
78
+ "betaServer": true}}],
79
+ "servlet-mapping": {
80
+ "cofaxCDS": "/",
81
+ "cofaxEmail": "/cofaxutil/aemail/*",
82
+ "cofaxAdmin": "/admin/*",
83
+ "fileServlet": "/static/*",
84
+ "cofaxTools": "/tools/*"},
85
+
86
+ "taglib": {
87
+ "taglib-uri": "cofax.tld",
88
+ "taglib-location": "/WEB-INF/tlds/cofax.tld"}}}
@@ -0,0 +1,26 @@
1
+ ## Demo calculator (iteration 1)
2
+
3
+ ### Source files
4
+ This sample project consists of the following files:
5
+ - **calc_ast_builder.rb** containing the class `CalcASTBuilder` that creates
6
+ the abstract syntax trees (AST) representation for a given parse result.
7
+
8
+ - **calc_ast_nodes.rb** containing the node classes for implementing the AST.
9
+ The nodes have a 'interpret' method that computes of the numeric value of the
10
+ node.
11
+
12
+ - **calc_demo.rb** a demo command-line program.
13
+ It parses the expression in the command-line and outputs the numeric result
14
+ For more details, run the command-line: `calc_demo.rb`
15
+
16
+ - **calc_grammar.rb** implementing the class `CalcGrammar`.
17
+ The grammar is a list of (production) rules that specifies the syntax of math
18
+ expression. A little examination of the grammar will reveal interesting
19
+ grammar features such as:
20
+ * Recursive rules (e.g. terminal in left-side of rule also appears in right-hand side)
21
+
22
+ - **calc_lexer.rb** implementing the class `CalcLexer`.
23
+ The purpose of the lexer is to break the math expression into a sequence of tokens.
24
+
25
+ - **calc_parser.rb** implementing a `CalcParser` class.
26
+ The parser processes the tokens stream from the lexer and delivers its results
@@ -0,0 +1,55 @@
1
+ ## Demo calculator (iteration 2)
2
+ Compared to the first iteration, this calculator supports:
3
+ - the exponentiation operator '**',
4
+ - the unary '-' operator (sign change),
5
+ - the PI and E constants,
6
+ - and several functions from Ruby's Math module.
7
+
8
+
9
+ It also prints out:
10
+ - The Concrete Syntax Tree (CST), a complete but verbose parse tree representation
11
+ - The Abstract Syntax Tree (AST), a customized parse tree representation that is more
12
+ convenient for further processing (here calculation.).
13
+
14
+ BUILT-IN OPERATORS AND FUNCTIONS
15
+ ---------------------------------
16
+ Operators: `+`, `-`, `*`, `/`, `**`
17
+ Numeric constants: `PI` (= 3.14159...), `E` (= 2.71828...)
18
+ Functions from Ruby's Math module:
19
+ `sqrt` (square root), `cbrt` (cubic root),
20
+ `exp` (exponential), `ln` (natural or neperian logarithm), `log10` (logarithm in base 10)
21
+ Trigonometric functions: `sin`, `cos`, `tan`
22
+ Inverse trigonometric functions: `asin`, `acos`, `atan`
23
+
24
+
25
+ ### Source files
26
+ This sample project consists of the following files:
27
+ - **calc_ast_builder.rb** containing the class `CalcASTBuilder` that creates
28
+ the abstract syntax trees (AST) representation for a given parse result.
29
+
30
+ - **calc_ast_nodes.rb** containing the node classes for implementing the AST.
31
+ The nodes have a 'interpret' method that computes of the numeric value of the
32
+ node.
33
+
34
+ - **calc_demo.rb** a demo command-line program.
35
+ It parses the expression in the command-line and outputs the numeric result
36
+ For more details, run the command-line: `calc_demo.rb`
37
+
38
+ - **calc_grammar.rb** implementing the class `CalcGrammar`.
39
+ The grammar is a list of (production) rules that specifies the syntax of math
40
+ expression. A little examination of the grammar will reveal interesting
41
+ grammar features such as:
42
+ * Recursive rules (e.g. terminal in left-side of rule also appears in right-hand side)
43
+
44
+ - **calc_lexer.rb** implementing the class `CalcLexer`.
45
+ The purpose of the lexer is to break the math expression into a sequence of tokens.
46
+
47
+ - **calc_parser.rb** implementing a `CalcParser` class.
48
+ The parser processes the tokens stream from the lexer and delivers its results
49
+
50
+ - **sample_result.txt** a sample text containing the output of calculator for the expression:
51
+ 2 * 3 + (1 + 3 ** 2). It illustrates the huge difference in size and nesting between the CST
52
+ (Concrete Syntax Tree) and the AST (Abstract Syntax Tree) representations. The generation of CSTs
53
+ comes out-of-the-box with **Rley**. Creating ASTs requires customization. Here, the class for the
54
+ AST nodes of the AST are defined in the **calc_ast_nodes.rb** and the methods for assembling the
55
+ AST from the grammar rules are implemented in the `CalcASTBuilder` class.