gen-text 0.0.2 → 0.0.3

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 (3) hide show
  1. data/README.md +33 -3
  2. data/lib/gen_text/compile.rb +16 -6
  3. metadata +1 -1
data/README.md CHANGED
@@ -24,15 +24,33 @@ Here `file.g` is a file containing the grammar description which consists of the
24
24
 
25
25
  nonterminal3 = expr3 ;
26
26
 
27
- Nonterminals start from a letter or "\_" and may contain alphanumeric characters, "\_", "-" or ":".
27
+ Nonterminals start from a letter or "\_" and may contain alphanumeric characters, "\_", "-" and ":".
28
28
 
29
29
  You may also use backquoted nonterminals:
30
30
 
31
31
  `nonterminal1` = expr1 ;
32
32
 
33
33
  `Nonterminal with arbitrary characters: [:|:]\/!` = expr2 ;
34
+
35
+ Trailing ";" can be omitted:
36
+
37
+ nonterminal1 = expr1
38
+
39
+ nonterminal2 = expr2
40
+
41
+ nonterminal3 = expr3
42
+
43
+ Also you may omit the left part in the first rule:
44
+
45
+ expr1
34
46
 
35
- You may use the following expressions in the right part:
47
+ nonterminal2 = expr2
48
+
49
+ nonterminal3 = expr3
50
+
51
+ ### Expressions ###
52
+
53
+ You may use the following expressions in the rules' right part:
36
54
 
37
55
  <table>
38
56
  <thead>
@@ -158,6 +176,18 @@ You may use the following expressions in the right part:
158
176
 
159
177
  TODO: Capture the generated output.
160
178
 
179
+ ### Alternate syntax ###
180
+
181
+ You may use "<-" instead of "=":
182
+
183
+ nonterm1 <- expr1 ;
184
+
185
+ nonterm2 <- expr2 ;
186
+
187
+ and "/" instead of "|":
188
+
189
+ `simple choice` <- "a" / "b" ;
190
+
161
191
  Examples
162
192
  --------
163
193
 
@@ -166,5 +196,5 @@ See them in "sample" directory.
166
196
  Links
167
197
  -----
168
198
 
169
- - [Documentation](http://www.rubydoc.info/gems/gen-text/0.0.1)
199
+ - [Documentation](http://www.rubydoc.info/gems/gen-text/0.0.3)
170
200
  - [Source code](https://github.com/LavirtheWhiolet/gen-text)
@@ -44,7 +44,7 @@ module GenText
44
44
  class Label
45
45
  end
46
46
 
47
- Program = ASTNode.new :rules do
47
+ Grammar = ASTNode.new :first_expr, :rules do
48
48
 
49
49
  def to_vm_code
50
50
  rule_labels = {}; begin
@@ -55,7 +55,13 @@ module GenText
55
55
  end
56
56
  code =
57
57
  [
58
- [:call, rule_labels[rules.first.name]],
58
+ *(
59
+ if first_expr then
60
+ first_expr.to_vm_code(Context.new(new_binding, rule_labels))
61
+ else
62
+ [[:call, rule_labels[rules.first.name]]]
63
+ end
64
+ ),
59
65
  [:halt],
60
66
  *rules.map do |rule|
61
67
  [
@@ -321,9 +327,13 @@ module GenText
321
327
  # ---- Syntax ----
322
328
 
323
329
  rule :start do
324
- whitespace_and_comments and
330
+ whitespace_and_comments and grammar
331
+ end
332
+
333
+ rule :grammar do
334
+ first_expr = opt { e = expr and opt {semicolon} and e } and
325
335
  rules = many { rule_definition } and
326
- _(Program[rules])
336
+ _(Grammar[first_expr.first, rules])
327
337
  end
328
338
 
329
339
  rule :expr do
@@ -406,7 +416,7 @@ module GenText
406
416
  _{ c = code("{=") and _(GenCode[c]) } or
407
417
  _{ c = code("{?") and _(CheckCode[c]) } or
408
418
  _{ action_code } or
409
- _{ n = nonterm and not_follows(:eq) and _(RuleCall[n]) } or
419
+ _{ n = nonterm and not_follows(:eq, :larrow) and _(RuleCall[n]) } or
410
420
  _{ gen_number } or
411
421
  _{ lparen and e = expr and rparen and e }
412
422
  end
@@ -422,7 +432,7 @@ module GenText
422
432
  end
423
433
 
424
434
  rule :rule_definition do
425
- n = nonterm and (_{eq} or _{larrow}) and e = choice and semicolon and
435
+ n = nonterm and (_{eq} or _{larrow}) and e = choice and opt {semicolon} and
426
436
  _(RuleDefinition[n, e])
427
437
  end
428
438
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gen-text
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: