rley 0.8.03 → 0.8.09

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +49 -8
  3. data/CHANGELOG.md +35 -0
  4. data/LICENSE.txt +1 -1
  5. data/README.md +1 -1
  6. data/appveyor.yml +1 -3
  7. data/examples/NLP/benchmark_pico_en.rb +6 -6
  8. data/examples/NLP/engtagger.rb +6 -6
  9. data/examples/data_formats/JSON/README.md +34 -0
  10. data/examples/data_formats/JSON/sample01.json +3 -0
  11. data/examples/data_formats/JSON/sample01.svg +36 -0
  12. data/examples/data_formats/JSON/sample02.json +6 -0
  13. data/examples/data_formats/JSON/sample02.svg +128 -0
  14. data/examples/data_formats/JSON/sample03.json +88 -0
  15. data/examples/general/calc_iter1/README.md +26 -0
  16. data/examples/general/calc_iter1/calc_lexer.rb +1 -1
  17. data/examples/general/calc_iter2/README.md +55 -0
  18. data/examples/general/calc_iter2/calc_lexer.rb +1 -1
  19. data/examples/general/calc_iter2/sample_result.txt +60 -0
  20. data/examples/general/general_examples.md +37 -0
  21. data/examples/general/left.rb +1 -1
  22. data/examples/general/right.rb +1 -1
  23. data/examples/tokenizer/README.md +51 -0
  24. data/examples/tokenizer/loxxy_raw_scanner.rex +109 -0
  25. data/examples/tokenizer/loxxy_raw_scanner.rex.rb +261 -0
  26. data/examples/tokenizer/loxxy_tokenizer.rb +113 -0
  27. data/examples/tokenizer/run_tokenizer.rb +33 -0
  28. data/examples/tokenizer/tokens.yml +249 -0
  29. data/lib/rley/constants.rb +1 -1
  30. data/lib/rley/engine.rb +2 -2
  31. data/lib/rley/interface.rb +3 -3
  32. data/lib/rley/lexical/literal.rb +29 -0
  33. data/lib/rley/lexical/token.rb +7 -4
  34. data/lib/rley/ptree/non_terminal_node.rb +1 -1
  35. data/lib/rley/rgn/all_notation_nodes.rb +5 -0
  36. data/lib/rley/{notation → rgn}/ast_builder.rb +19 -12
  37. data/lib/rley/{notation → rgn}/ast_node.rb +13 -12
  38. data/lib/rley/{notation → rgn}/ast_visitor.rb +10 -10
  39. data/lib/rley/rgn/composite_node.rb +28 -0
  40. data/lib/rley/{notation → rgn}/grammar.rb +1 -1
  41. data/lib/rley/{notation → rgn}/grammar_builder.rb +86 -124
  42. data/lib/rley/{notation → rgn}/parser.rb +7 -7
  43. data/lib/rley/rgn/repetition_node.rb +62 -0
  44. data/lib/rley/rgn/sequence_node.rb +30 -0
  45. data/lib/rley/{notation → rgn}/symbol_node.rb +15 -7
  46. data/lib/rley/{notation → rgn}/tokenizer.rb +4 -4
  47. data/lib/rley/syntax/base_grammar_builder.rb +0 -2
  48. data/lib/rley/syntax/grm_symbol.rb +0 -4
  49. data/lib/rley/syntax/non_terminal.rb +4 -0
  50. data/lib/rley/syntax/terminal.rb +10 -6
  51. data/lib/rley.rb +1 -1
  52. data/spec/rley/lexical/literal_spec.rb +33 -0
  53. data/spec/rley/lexical/token_spec.rb +15 -4
  54. data/spec/rley/parser/dangling_else_spec.rb +5 -7
  55. data/spec/rley/parser/gfg_chart_spec.rb +0 -1
  56. data/spec/rley/parser/gfg_earley_parser_spec.rb +179 -184
  57. data/spec/rley/parser/gfg_parsing_spec.rb +1 -2
  58. data/spec/rley/{notation → rgn}/grammar_builder_spec.rb +60 -56
  59. data/spec/rley/{notation → rgn}/parser_spec.rb +36 -24
  60. data/spec/rley/rgn/repetition_node_spec.rb +56 -0
  61. data/spec/rley/rgn/sequence_node_spec.rb +48 -0
  62. data/spec/rley/rgn/symbol_node_spec.rb +33 -0
  63. data/spec/rley/{notation → rgn}/tokenizer_spec.rb +2 -2
  64. data/spec/rley/support/ambiguous_grammar_helper.rb +2 -2
  65. data/spec/rley/support/grammar_int_seq_helper.rb +2 -2
  66. data/spec/rley/syntax/base_grammar_builder_spec.rb +7 -7
  67. data/spec/rley/syntax/grammar_spec.rb +6 -9
  68. metadata +58 -39
  69. data/lib/rley/notation/all_notation_nodes.rb +0 -4
  70. data/lib/rley/notation/grouping_node.rb +0 -23
  71. data/lib/rley/notation/sequence_node.rb +0 -35
  72. data/lib/rley/parser/parse_tracer.rb +0 -103
  73. data/lib/rley/syntax/literal.rb +0 -20
  74. data/lib/rley/syntax/verbatim_symbol.rb +0 -27
  75. data/spec/rley/syntax/literal_spec.rb +0 -31
  76. 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: 3e3f429e3129dc66ab35ca8bba695b0788d710c6e61033a086d7b3c7c40af7cf
4
- data.tar.gz: eea709ac4554918cc690e27ebb8540418234b6b0706fd98390c6f8f5d603f868
3
+ metadata.gz: 9734bc9875c8931a5cd5c5497df1a77a3c938076c86d2748557b8ec901d09de6
4
+ data.tar.gz: 20a2a6a9b88752645cf731f6790b7f89729fb108f13701048a6cc8a2c65521f6
5
5
  SHA512:
6
- metadata.gz: bf936e0f984789b7c509b9bbd5078c787e79caef32120f4409b23225fe7589d1bdddf5e74e1467401acffb329461b0812c3bb46a9da4b651ae10c94fcd4a52e1
7
- data.tar.gz: 606e0e80bfedcd9915eff6b776a826b9032cef201febc07bfcbc1a027622606584bd83e9874a5f448637dd46f66592490c92138c874a07ae630d678e17b5982f
6
+ metadata.gz: e203c3d6cf1b4f8b32a16af06ffe2a4548f8a53c37a2677fd13e8b3695a1e482f7d46177b3861d0b5c5b6139827133d09d1213821a7ec91b8dd805fcf3eac4dd
7
+ data.tar.gz: 43be3973376040fed3a9db55207d68171a0a6084ad9a102abcd26f47d60600c8aa9165a134c67b0f443e73e4e0cdd2d5a65e5271f63081a21f83aea0550b4474
data/.rubocop.yml CHANGED
@@ -1,11 +1,13 @@
1
1
  AllCops:
2
2
  Exclude:
3
- - 'examples/**/*'
4
- - 'exp/**/*'
3
+ - 'exp/**/*'
5
4
 
6
5
  Gemspec/DateAssignment:
7
6
  Enabled: true
8
7
 
8
+ Gemspec/RequireMFA: # new in 1.23
9
+ Enabled: false
10
+
9
11
  Layout/ArgumentAlignment:
10
12
  Enabled: false
11
13
 
@@ -81,6 +83,9 @@ Layout/TrailingEmptyLines:
81
83
  Layout/TrailingWhitespace:
82
84
  Enabled: true
83
85
 
86
+ Lint/AmbiguousOperatorPrecedence:
87
+ Enabled: true
88
+
84
89
  Lint/AmbiguousAssignment:
85
90
  Enabled: true
86
91
 
@@ -105,6 +110,9 @@ Lint/EmptyClass:
105
110
  Lint/EmptyInPattern:
106
111
  Enabled: true
107
112
 
113
+ Lint/IncompatibleIoSelectWithFiberScheduler:
114
+ Enabled: true
115
+
108
116
  Lint/LambdaWithoutLiteralBlock:
109
117
  Enabled: true
110
118
 
@@ -126,6 +134,9 @@ Lint/RaiseException:
126
134
  Lint/RedundantDirGlobSort:
127
135
  Enabled: true
128
136
 
137
+ Lint/RequireRelativeSelfPath:
138
+ Enabled: true
139
+
129
140
  Lint/RescueException:
130
141
  Enabled: true
131
142
 
@@ -153,6 +164,9 @@ Lint/UnusedMethodArgument:
153
164
  Lint/UselessAccessModifier:
154
165
  Enabled: true
155
166
 
167
+ Lint/UselessRuby2Keywords: # new in 1.23
168
+ Enabled: true
169
+
156
170
  Lint/Void:
157
171
  Enabled: false
158
172
 
@@ -192,6 +206,9 @@ Metrics/ModuleLength:
192
206
  Metrics/PerceivedComplexity:
193
207
  Enabled: false
194
208
 
209
+ Naming/BlockForwarding: # new in 1.24
210
+ Enabled: true
211
+
195
212
  Naming/ConstantName:
196
213
  Enabled: false
197
214
 
@@ -213,6 +230,9 @@ Naming/MethodName:
213
230
  Naming/VariableName:
214
231
  Enabled: false
215
232
 
233
+ Security/IoMethods:
234
+ Enabled: true
235
+
216
236
  Style/Alias:
217
237
  Enabled: true
218
238
 
@@ -267,6 +287,12 @@ Style/ExpandPathArguments:
267
287
  Style/ExponentialNotation:
268
288
  Enabled: true
269
289
 
290
+ Style/FileRead: # new in 1.24
291
+ Enabled: true
292
+
293
+ Style/FileWrite: # new in 1.24
294
+ Enabled: true
295
+
270
296
  Style/GuardClause:
271
297
  Enabled: false
272
298
 
@@ -291,11 +317,14 @@ Style/InPatternThen:
291
317
  Style/InverseMethods:
292
318
  Enabled: false
293
319
 
320
+ Style/MapToHash: # new in 1.24
321
+ Enabled: true
322
+
294
323
  Style/MissingRespondToMissing:
295
324
  Enabled: false
296
-
325
+
297
326
  Style/MultilineInPatternThen:
298
- Enabled: true
327
+ Enabled: true
299
328
 
300
329
  Style/NegatedIfElseCondition:
301
330
  Enabled: true
@@ -306,11 +335,20 @@ Style/Next:
306
335
  Style/NilLambda:
307
336
  Enabled: true
308
337
 
338
+ Style/NumberedParameters:
339
+ Enabled: true
340
+
341
+ Style/NumberedParametersLimit:
342
+ Enabled: true
343
+
309
344
  Style/NumericLiterals:
310
345
  Enabled: false
311
-
346
+
347
+ Style/OpenStructUse: # new in 1.23
348
+ Enabled: true
349
+
312
350
  Style/QuotedSymbols:
313
- Enabled: true
351
+ Enabled: true
314
352
 
315
353
  Style/RaiseArgs:
316
354
  Enabled: true
@@ -323,9 +361,9 @@ Style/RedundantReturn:
323
361
 
324
362
  Style/RedundantSelf:
325
363
  Enabled: true
326
-
364
+
327
365
  Style/RedundantSelfAssignmentBranch:
328
- Enabled: true
366
+ Enabled: true
329
367
 
330
368
  Style/RegexpLiteral:
331
369
  Enabled: false
@@ -333,6 +371,9 @@ Style/RegexpLiteral:
333
371
  Style/PercentLiteralDelimiters:
334
372
  Enabled: false
335
373
 
374
+ Style/SelectByRegexp:
375
+ Enabled: true
376
+
336
377
  Style/StderrPuts:
337
378
  Enabled: false
338
379
 
data/CHANGELOG.md CHANGED
@@ -1,3 +1,38 @@
1
+ ### 0.8.09 / 2022-01-28
2
+ - Added code for coming tutorial
3
+
4
+ * [NEW] Folder `tutorial` contains code used in tutorial (in wiki)
5
+ * [NEW] Folders `TOML\iter_1` .. `TOML\iter_2` contains code for a TOML parser
6
+ * [CHANGE] File `.rubocop.yml` updated to take into account new 1.25 cops.
7
+ * [CHANGE] File `.rubocop.yml` updated to take into account new 1.25 cops.
8
+
9
+ ### 0.8.08 / 2021-10-31
10
+ - Fixes in example files, Refactored module `Notation` renamed `to `RGN´
11
+
12
+ * [CHANGE] Module `Notation` changed to `RGN`.
13
+
14
+ * [FIX] `examples/general/calc_iter1/CalcLexer#initialize` now strips whitespaces at end of expression to parse.
15
+ * [FIX] `examples/general/calc_iter2/CalcLexer#initialize` now strips whitespaces at end of expression to parse.
16
+ * [FIX] File `examples/general/left.rb` Call to wrong grammar builder
17
+ * [FIX] File `examples/general/right.rb` Call to wrong grammar builder
18
+ * [FIX] File `examples/NLP/benchmark_pico_en.rb` Grammar rules used obsolete rule syntax
19
+ * [FIX] File `examples/NLP/engtagger.rb` Grammar rules used obsolete rule syntax
20
+
21
+ ### 0.8.06 / 2021-10-06
22
+ - Added more comment in `/examples/tokenizer` files
23
+
24
+ * [CHANGE] File `rley.gemspec` some files weren't put the gem files.
25
+
26
+ ### 0.8.05 / 2021-10-04
27
+ - Added example of generated scanner. Unused class removal, code re-styling to please `Rubocop`
28
+
29
+ * [NEW] Folder `example\tokenizer` contains an example with a scanner that was generated.
30
+ * [NEW] Class `Rley::Lexical::Literal` a specialization of Token class for literal tokens.
31
+ * [CHANGE] File `.rubocop.yml` updated to take into account new 1.21 and 1.22 cops.
32
+ * [DELETED] Class `Rley::Parser::ParserTracer` this class was no more in use.
33
+ * [DELETED] Class `Rley::Syntax::Literal` this class was unused.
34
+ * [DELETED] Class `Rley::Syntax::VerbatimSymbol` this class was unused.
35
+
1
36
  ### 0.8.03 / 2021-08-27
2
37
  - Added missing method in `ASTBaseBuilder` class
3
38
 
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014-2021 Dimitri Geshef
1
+ Copyright (c) 2014-2022 Dimitri Geshef
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -458,5 +458,5 @@ standard parser textbooks. Here are a few references (and links) of papers on GF
458
458
 
459
459
  Copyright
460
460
  ---------
461
- Copyright (c) 2014-2020, Dimitri Geshef.
461
+ Copyright (c) 2014-2022, Dimitri Geshef.
462
462
  __Rley__ is released under the MIT License see [LICENSE.txt](https://github.com/famished-tiger/Rley/blob/master/LICENSE.txt) for details.
data/appveyor.yml CHANGED
@@ -1,15 +1,13 @@
1
1
  version: '{build}'
2
2
  max_jobs: 5
3
3
  environment:
4
- matrix:
4
+ matrix:
5
5
  - Ruby_version: 26-x64
6
6
  - Ruby_version: 25-x64
7
7
  - Ruby_version: 24-x64
8
- - Ruby_version: 23-x64
9
8
  - Ruby_version: 26
10
9
  - Ruby_version: 25
11
10
  - Ruby_version: 24
12
- - Ruby_version: 23
13
11
 
14
12
  install:
15
13
  - set PATH=C:\Ruby%Ruby_version%\bin;%PATH%
@@ -24,13 +24,13 @@ engine.build_grammar do
24
24
  add_terminals('Determiner', 'Preposition')
25
25
 
26
26
  # Here we define the productions (= grammar rules)
27
- rule 'S' => %w[NP VP]
27
+ rule 'S' => 'NP VP'
28
28
  rule 'NP' => 'Proper-Noun'
29
- rule 'NP' => %w[Determiner Noun]
30
- rule 'NP' => %w[Determiner Noun PP]
31
- rule 'VP' => %w[Verb NP]
32
- rule 'VP' => %w[Verb NP PP]
33
- rule 'PP' => %w[Preposition NP]
29
+ rule 'NP' => 'Determiner Noun'
30
+ rule 'NP' => 'Determiner Noun PP'
31
+ rule 'VP' => 'Verb NP'
32
+ rule 'VP' => 'Verb NP PP'
33
+ rule 'PP' => 'Preposition NP'
34
34
  end
35
35
 
36
36
  ########################################
@@ -136,13 +136,13 @@ nlp_engine.build_grammar do
136
136
  add_terminals('DET', 'IN', 'VBD')
137
137
 
138
138
  # Here we define the productions (= grammar rules)
139
- rule 'S' => %w[NP VP]
139
+ rule 'S' => 'NP VP'
140
140
  rule 'NP' => 'NNP'
141
- rule 'NP' => %w[DET NN]
142
- rule 'NP' => %w[DET NN PP]
143
- rule 'VP' => %w[VBD NP]
144
- rule 'VP' => %w[VBD NP PP]
145
- rule 'PP' => %w[IN NP]
141
+ rule 'NP' => 'DET NN'
142
+ rule 'NP' => 'DET NN PP'
143
+ rule 'VP' => 'VBD NP'
144
+ rule 'VP' => 'VBD NP PP'
145
+ rule 'PP' => 'IN NP'
146
146
  end
147
147
 
148
148
  # text = "Yo I'm not done with you"
@@ -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
@@ -24,7 +24,7 @@ class CalcLexer
24
24
  class ScanError < StandardError; end
25
25
 
26
26
  def initialize(source)
27
- @scanner = StringScanner.new(source)
27
+ @scanner = StringScanner.new(source.strip)
28
28
  @lineno = 1
29
29
  end
30
30