ebnf 0.3.1 → 0.3.2
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.
- checksums.yaml +6 -14
- data/README.md +8 -58
- data/VERSION +1 -1
- data/bin/ebnf +7 -5
- data/etc/doap.ttl +11 -12
- data/etc/ebnf.ebnf +45 -41
- data/etc/ebnf.ll1.sxp +114 -197
- data/etc/ebnf.rb +149 -459
- data/etc/ebnf.sxp +27 -22
- data/etc/turtle.ll1.sxp +5 -5
- data/etc/turtle.rb +55 -50
- data/etc/turtle.sxp +20 -21
- data/lib/ebnf/base.rb +32 -17
- data/lib/ebnf/ll1.rb +39 -7
- data/lib/ebnf/ll1/lexer.rb +8 -20
- data/lib/ebnf/ll1/parser.rb +4 -0
- data/lib/ebnf/parser.rb +55 -51
- data/lib/ebnf/rule.rb +36 -0
- metadata +15 -15
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
ZDJjNjlmYjZhZWQ5OGIwZTgwMjNlYzc0NWZlMzA3NDExYTI3N2M3YTJiNjFj
|
10
|
-
MDAyOGQxMjUzYjkwNGM0NmQxZjdjMDVkNDU2MWE5MjE3OWEwZmRhN2ViYjQy
|
11
|
-
ZTE4NDM1MGUxOTNhZGU0OTJjNzEzOTlkMzEzYjQ2OWJmODBjMTM=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
OTk3MzAzMzY4MGU0NjBhYjM4YWNkNDJhNDEwYTM2YzM5NDZiZGM0ZjZjZDA0
|
14
|
-
YTM4YTMyYzUyYmE0MjFkYTJmZjE2MDYyZjI2ZTAyMzI4NTMwNTI5ZThiOTcx
|
15
|
-
ZGQzMTdkMjdlM2Y0NTFjNTI1YTM0YjMxNjlhZWYwZTQ3ODMxNTE=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3c3b6668384bfe503728e795abf4350ec4a327c9
|
4
|
+
data.tar.gz: d2b8ed718f483766f3e7756dd2feaac637d29dbe
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 0271fdc7808467c76a0c95a66982e6d97efdd9bcac52b5bcfde66fb1b763fab7a82eea344a98bd4fd81ef95de5a7865b88a2b912876ef69ed4814ba05cdbe635
|
7
|
+
data.tar.gz: 47e4b1314eb8068da0a4802d04206d47cfa2d52fe46b8b740cc00cd6187fea9b3e658441af3c2848d3b1a3bccfc614b31f95ffa3130f88cc42ade09aca0e86df
|
data/README.md
CHANGED
@@ -24,7 +24,7 @@ Output rules and terminals as S-Expressions, Turtle or EBNF
|
|
24
24
|
puts ebnf.to_ttl
|
25
25
|
puts ebnf.to_ebnf
|
26
26
|
|
27
|
-
Transform EBNF to BNF (generates `alt` or `seq` from `plus`, `star` or `opt`)
|
27
|
+
Transform EBNF to BNF (generates sub-productions using `alt` or `seq` from `plus`, `star` or `opt`)
|
28
28
|
|
29
29
|
ebnf.make_bnf
|
30
30
|
|
@@ -81,63 +81,11 @@ to each `terminal` and `production`. A trivial parser loop can be described as f
|
|
81
81
|
end
|
82
82
|
|
83
83
|
## EBNF Grammar
|
84
|
-
The [EBNF][] variant used here is based on [W3C]
|
84
|
+
The [EBNF][] variant used here is based on [W3C](http://w3.org/) [EBNF][] (see {file:etc/ebnf.ebnf EBNF grammar}) as defined in the
|
85
85
|
[XML 1.0 recommendation](http://www.w3.org/TR/REC-xml/), with minor extensions.
|
86
86
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
[2] declaration ::= '@terminals' | '@pass'
|
91
|
-
|
92
|
-
[3] rule ::= lhs '::=' expression
|
93
|
-
|
94
|
-
[4] lhs ::= '[' (SYMBOL | '.')+ ']' SYMBOL
|
95
|
-
|
96
|
-
[5] expression ::= alt
|
97
|
-
|
98
|
-
[6] alt ::= seq ('|' seq)*
|
99
|
-
|
100
|
-
[7] seq ::= diff+
|
101
|
-
|
102
|
-
[8] diff ::= postfix ('-' postfix)*
|
103
|
-
|
104
|
-
[9] postfix ::= primary ( [?*+] )?
|
105
|
-
|
106
|
-
[10] primary ::= HEX
|
107
|
-
| RANGE
|
108
|
-
| ENUM
|
109
|
-
| O_RANGE
|
110
|
-
| O_ENUM
|
111
|
-
| STRING1
|
112
|
-
| STRING2
|
113
|
-
| '(' expression ')'
|
114
|
-
|
115
|
-
@terminals
|
116
|
-
|
117
|
-
[11] SYMBOL ::= ([a-z] | [A-Z] | [0-9] | "_")+
|
118
|
-
|
119
|
-
[12] HEX ::= '#x' ([0-9] | [a-f] | [A-F])+
|
120
|
-
|
121
|
-
[13] RANGE ::= '[' CHAR '-' CHAR ']'
|
122
|
-
|
123
|
-
[14] ENUM ::= '[' CHAR+ ']'
|
124
|
-
|
125
|
-
[15] O_RANGE ::= '[^' CHAR '-' CHAR ']'
|
126
|
-
|
127
|
-
[16] OENUM ::= '[^' CHAR+ ']'
|
128
|
-
|
129
|
-
[17] STRING1 ::= '"' (CHAR - '"')* '"'
|
130
|
-
|
131
|
-
[18] STRING2 ::= "'" (CHAR - "'")* "'"
|
132
|
-
|
133
|
-
[19] CHAR ::= HEX
|
134
|
-
| ('\\' [\\trn'"])
|
135
|
-
| [^\t\r\n'"]
|
136
|
-
|
137
|
-
@pass ::= (
|
138
|
-
[#x20\t\r\n]
|
139
|
-
|
|
140
|
-
)+
|
87
|
+
## Example parser
|
88
|
+
For an example parser built using this gem, see {file:examples/ebnf-parser/README EBNF Parser example}. This example creates a parser for the [EBNF][] grammar which generates the same Abstract Syntax Tree as the built-in parser in the gem.
|
141
89
|
|
142
90
|
## Acknowledgements
|
143
91
|
Much of this work, particularly the generic parser, is inspired by work originally done by
|
@@ -148,7 +96,6 @@ The EBNF parser was inspired by Dan Connolly's
|
|
148
96
|
[EBNF to BNF Notation-3 rules](http://www.w3.org/2000/10/swap/grammar/ebnf2bnf.n3),
|
149
97
|
and [First Follow Notation-3 rules](http://www.w3.org/2000/10/swap/grammar/first_follow.n3).
|
150
98
|
|
151
|
-
|
152
99
|
## Documentation
|
153
100
|
Full documentation available on [Rubydoc.info][EBNF doc].
|
154
101
|
|
@@ -177,6 +124,8 @@ Full documentation available on [Rubydoc.info][EBNF doc].
|
|
177
124
|
This is free and unencumbered public domain software. For more information,
|
178
125
|
see <http://unlicense.org/> or the accompanying {file:UNLICENSE} file.
|
179
126
|
|
127
|
+
A copy of the [Turtle EBNF][] and derived parser files are included in the repository, which are not covered under the UNLICENSE. These files are covered via the [W3C Document License](http://www.w3.org/Consortium/Legal/2002/copyright-documents-20021231).
|
128
|
+
|
180
129
|
[Ruby]: http://ruby-lang.org/
|
181
130
|
[YARD]: http://yardoc.org/
|
182
131
|
[YARD-GS]: http://rubydoc.info/docs/yard/file/docs/GettingStarted.md
|
@@ -186,4 +135,5 @@ see <http://unlicense.org/> or the accompanying {file:UNLICENSE} file.
|
|
186
135
|
[First/Follow]: http://en.wikipedia.org/wiki/LL_parser#Constructing_an_LL.281.29_parsing_table
|
187
136
|
[LL(1)]: http://www.csd.uwo.ca/~moreno//CS447/Lectures/Syntax.html/node14.html
|
188
137
|
[LL(1) Parser]: http://en.wikipedia.org/wiki/LL_parser
|
189
|
-
[Tokenizer]: http://en.wikipedia.org/wiki/Lexical_analysis#Tokenizer
|
138
|
+
[Tokenizer]: http://en.wikipedia.org/wiki/Lexical_analysis#Tokenizer
|
139
|
+
[Turtle EBNF]: http://dvcs.w3.org/hg/rdf/file/default/rdf-turtle/turtle.bnf
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.2
|
data/bin/ebnf
CHANGED
@@ -10,7 +10,6 @@ require "bundler/setup"
|
|
10
10
|
require 'rubygems'
|
11
11
|
require 'getoptlong'
|
12
12
|
require 'ebnf'
|
13
|
-
require 'sxp'
|
14
13
|
|
15
14
|
def dump_tables(grammarFile, ebnf, output, options)
|
16
15
|
ebnf.build_tables
|
@@ -29,6 +28,7 @@ def dump_tables(grammarFile, ebnf, output, options)
|
|
29
28
|
ebnf.outputTable(output, 'TERMINALS', ebnf.terminals, 1)
|
30
29
|
ebnf.outputTable(output, 'FIRST', ebnf.first, 1)
|
31
30
|
ebnf.outputTable(output, 'FOLLOW', ebnf.follow, 1)
|
31
|
+
ebnf.outputTable(output, 'PASS', [ebnf.pass], 1) if ebnf.pass
|
32
32
|
unless output == STDOUT
|
33
33
|
output.puts "end"
|
34
34
|
end
|
@@ -36,7 +36,7 @@ def dump_tables(grammarFile, ebnf, output, options)
|
|
36
36
|
end
|
37
37
|
|
38
38
|
options = {
|
39
|
-
:
|
39
|
+
:output_format => :sxp,
|
40
40
|
:prefix => "ttl",
|
41
41
|
:namespace => "http://www.w3.org/ns/formats/Turtle#",
|
42
42
|
}
|
@@ -49,6 +49,7 @@ OPT_ARGS = [
|
|
49
49
|
["--evaluate","-e", GetoptLong::REQUIRED_ARGUMENT,"Evaluate argument as a JSON-LD document"],
|
50
50
|
["--ll1", GetoptLong::REQUIRED_ARGUMENT,"Generate First/Follow rules, argument is start symbol"],
|
51
51
|
["--format", "-f", GetoptLong::REQUIRED_ARGUMENT,"Specify output format one of ttl, sxp, or rb"],
|
52
|
+
["--input-format", GetoptLong::REQUIRED_ARGUMENT,"Specify input format one of ebnf or sxp"],
|
52
53
|
["--mod-name", GetoptLong::REQUIRED_ARGUMENT,"Module name used when creating ruby tables"],
|
53
54
|
["--output", "-o", GetoptLong::REQUIRED_ARGUMENT,"Output to the specified file path"],
|
54
55
|
["--prefix", "-p", GetoptLong::REQUIRED_ARGUMENT,"Prefix to use when generating Turtle"],
|
@@ -79,7 +80,8 @@ opts.each do |opt, arg|
|
|
79
80
|
when '--dbg' then options[:debug] = true
|
80
81
|
when '--bnf' then options[:bnf] = true
|
81
82
|
when '--evaluate' then input = arg
|
82
|
-
when '--format'
|
83
|
+
when '--input-format' then options[:format] = arg.to_sym
|
84
|
+
when '--format' then options[:output_format] = arg.to_sym
|
83
85
|
when '--ll1' then options[:ll1] = arg.to_sym
|
84
86
|
when '--mod-name' then options[:mod_name] = arg
|
85
87
|
when '--output' then out = File.open(arg, "w")
|
@@ -90,7 +92,7 @@ opts.each do |opt, arg|
|
|
90
92
|
end
|
91
93
|
end
|
92
94
|
|
93
|
-
if options[:
|
95
|
+
if options[:output_format] == :rb && !options[:ll1]
|
94
96
|
STDERR.puts "outputing in .rb format requires -ll"
|
95
97
|
exit(1)
|
96
98
|
end
|
@@ -101,7 +103,7 @@ ebnf = EBNF.parse(input || STDIN, options)
|
|
101
103
|
ebnf.make_bnf if options[:bnf] || options[:ll1]
|
102
104
|
ebnf.first_follow(options[:ll1]) if options[:ll1]
|
103
105
|
|
104
|
-
res = case options[:
|
106
|
+
res = case options[:output_format]
|
105
107
|
when :sxp then ebnf.to_sxp
|
106
108
|
when :ttl then ebnf.to_ttl(options[:prefix], options[:namespace])
|
107
109
|
when :rb then dump_tables(ARGV[0], ebnf, out, options)
|
data/etc/doap.ttl
CHANGED
@@ -7,27 +7,26 @@
|
|
7
7
|
@prefix ex: <http://example.org/> .
|
8
8
|
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
|
9
9
|
|
10
|
-
<http://rubygems.org/gems/
|
11
|
-
doap:name "
|
12
|
-
doap:homepage <http://
|
10
|
+
<http://rubygems.org/gems/ebnf> a doap:Project, earl:TestSubject, earl:Software ;
|
11
|
+
doap:name "ebnf" ;
|
12
|
+
doap:homepage <http://gkellogg.github.com/ebnf> ;
|
13
13
|
doap:license <http://creativecommons.org/licenses/publicdomain/> ;
|
14
|
-
doap:shortdesc "
|
15
|
-
doap:description "
|
14
|
+
doap:shortdesc "EBNF parser and parser generator"@en ;
|
15
|
+
doap:description "EBNF is a Ruby parser for W3C EBNF and a parser generator for compliant LL(1) grammars."@en ;
|
16
16
|
doap:created "2011-08-29"^^xsd:date ;
|
17
17
|
doap:programming-language "Ruby" ;
|
18
|
-
doap:implements <http://
|
18
|
+
doap:implements <http://dbpedia.org/resource/Compiler-compiler> ;
|
19
19
|
doap:category <http://dbpedia.org/resource/Resource_Description_Framework>,
|
20
20
|
<http://dbpedia.org/resource/Ruby_(programming_language)> ;
|
21
|
-
doap:download-page <http://rubygems.org/gems/
|
21
|
+
doap:download-page <http://rubygems.org/gems/ebnf> ;
|
22
22
|
doap:mailing-list <http://lists.w3.org/Archives/Public/public-rdf-ruby/> ;
|
23
|
-
doap:bug-database <http://github.com/
|
23
|
+
doap:bug-database <http://github.com/gkellogg/ebnf/issues> ;
|
24
24
|
doap:blog <http://greggkellogg.net/> ;
|
25
25
|
doap:developer <http://greggkellogg.net/foaf#me> ;
|
26
26
|
doap:maintainer <http://greggkellogg.net/foaf#me> ;
|
27
27
|
doap:documenter <http://greggkellogg.net/foaf#me> ;
|
28
28
|
foaf:maker <http://greggkellogg.net/foaf#me> ;
|
29
|
-
dc:title "
|
30
|
-
dc:description "
|
29
|
+
dc:title "ebnf" ;
|
30
|
+
dc:description "EBNF is a Ruby parser for W3C EBNF and a parser generator for compliant LL(1) grammars."@en ;
|
31
31
|
dc:date "2011-08-29"^^xsd:date ;
|
32
|
-
dc:creator <http://greggkellogg.net/foaf#me>
|
33
|
-
dc:isPartOf <http://rubygems.org/gems/rdf> .
|
32
|
+
dc:creator <http://greggkellogg.net/foaf#me> .
|
data/etc/ebnf.ebnf
CHANGED
@@ -1,62 +1,66 @@
|
|
1
|
-
/* An EBNF grammar for EBNF */
|
2
|
-
[1] ebnf ::= (declaration | rule)*
|
1
|
+
/* An EBNF grammar for EBNF */
|
2
|
+
[1] ebnf ::= (declaration | rule)*
|
3
3
|
|
4
|
-
[2] declaration ::= '@terminals' | pass
|
4
|
+
[2] declaration ::= '@terminals' | pass
|
5
5
|
|
6
|
-
[3] rule ::=
|
6
|
+
[3] rule ::= LHS expression
|
7
7
|
|
8
|
-
|
8
|
+
# Use a terminal to match the identifier, rule name and assignment due to
|
9
|
+
# confusion between the identifier ENUM
|
9
10
|
|
10
|
-
[
|
11
|
+
[4] expression ::= alt
|
11
12
|
|
12
|
-
[
|
13
|
+
[5] alt ::= seq ('|' seq)*
|
13
14
|
|
14
|
-
[
|
15
|
+
[6] seq ::= diff+
|
15
16
|
|
16
|
-
[
|
17
|
+
[7] diff ::= postfix ('-' postfix)?
|
17
18
|
|
18
|
-
[
|
19
|
+
[8] postfix ::= primary POSTFIX?
|
19
20
|
|
20
|
-
[
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
21
|
+
[9] primary ::= HEX
|
22
|
+
| SYMBOL
|
23
|
+
| RANGE
|
24
|
+
| ENUM
|
25
|
+
| O_RANGE
|
26
|
+
| O_ENUM
|
27
|
+
| STRING1
|
28
|
+
| STRING2
|
29
|
+
| '(' expression ')'
|
28
30
|
|
29
|
-
[
|
30
|
-
(
|
31
|
-
[#x20\t\r\n]
|
32
|
-
| ( '#' | '//' ) [^\r\n]*
|
33
|
-
| ('/*' ([^*] | '*' [^/])* '*/')
|
34
|
-
)+
|
31
|
+
[10] pass ::= '@pass' expression
|
35
32
|
|
36
|
-
@terminals
|
33
|
+
@terminals
|
37
34
|
|
38
|
-
[
|
35
|
+
[11] LHS ::= ENUM SYMBOL "::="
|
39
36
|
|
40
|
-
[
|
37
|
+
[12] SYMBOL ::= ([a-z] | [A-Z] | [0-9] | "_" | ".")+
|
41
38
|
|
42
|
-
[
|
39
|
+
[13] HEX ::= '#x' ([0-9]|[a-f]|[A-F]) ([0-9]|[a-f]|[A-F])
|
43
40
|
|
44
|
-
[
|
41
|
+
[14] RANGE ::= '[' CHAR '-' CHAR ']'
|
45
42
|
|
46
|
-
[
|
43
|
+
[15] ENUM ::= '[' CHAR+ ']'
|
47
44
|
|
48
|
-
[
|
45
|
+
[16] O_RANGE ::= '[^' CHAR '-' CHAR ']'
|
49
46
|
|
50
|
-
[
|
47
|
+
[17] O_ENUM ::= '[^' CHAR+ ']'
|
51
48
|
|
52
|
-
[
|
49
|
+
[18] STRING1 ::= '"' (CHAR | [\t\'\[\]\(\)\-])* '"'
|
53
50
|
|
54
|
-
[
|
55
|
-
| ('\\' [\\trn'"])
|
56
|
-
| [^\t\r\n'"]
|
51
|
+
[19] STRING2 ::= "'" (CHAR | [\t\"\[\]\(\)\-])* "'"
|
57
52
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
53
|
+
[20] CHAR ::= HEX
|
54
|
+
| ('\\' [\\trn\'\"\[\]\(\)\-])
|
55
|
+
| [^\t\r\n\'\"\[\]\(\)\-]
|
56
|
+
|
57
|
+
# Should be able to do this inline, but not until terminal regular expressions are created automatically
|
58
|
+
[21] POSTFIX ::= [?*+]
|
59
|
+
|
60
|
+
[22] PASS ::= ( [#x20\t\r\n]
|
61
|
+
| ( '#' | '//' ) [^\r\n]*
|
62
|
+
| '/*' (( '*' [^/] )? | [^*] )* '*/'
|
63
|
+
)+
|
64
|
+
|
65
|
+
# Should be able to do this inline, but not until terminal regular expressions are created automatically
|
66
|
+
@pass PASS
|
data/etc/ebnf.ll1.sxp
CHANGED
@@ -1,247 +1,164 @@
|
|
1
|
-
|
2
|
-
(
|
1
|
+
(
|
3
2
|
(rule _empty "0" (first _eps) (seq))
|
3
|
+
(pass (seq PASS))
|
4
4
|
(rule ebnf "1"
|
5
5
|
(start #t)
|
6
|
-
(first "@pass" "@terminals"
|
6
|
+
(first "@pass" "@terminals" LHS _eps)
|
7
7
|
(follow _eof)
|
8
8
|
(alt _empty _ebnf_2))
|
9
9
|
(rule _ebnf_1 "1.1"
|
10
|
-
(first "@pass" "@terminals"
|
11
|
-
(follow "@pass" "@terminals"
|
10
|
+
(first "@pass" "@terminals" LHS)
|
11
|
+
(follow "@pass" "@terminals" LHS _eof)
|
12
12
|
(alt declaration rule))
|
13
|
-
(rule _ebnf_2 "1.2" (first "@pass" "@terminals"
|
14
|
-
(rule _ebnf_3 "1.3" (first "@pass" "@terminals"
|
13
|
+
(rule _ebnf_2 "1.2" (first "@pass" "@terminals" LHS) (follow _eof) (seq _ebnf_1 ebnf))
|
14
|
+
(rule _ebnf_3 "1.3" (first "@pass" "@terminals" LHS _eps) (follow _eof) (seq ebnf))
|
15
15
|
(rule declaration "2"
|
16
16
|
(first "@pass" "@terminals")
|
17
|
-
(follow "@pass" "@terminals"
|
17
|
+
(follow "@pass" "@terminals" LHS _eof)
|
18
18
|
(alt "@terminals" pass))
|
19
|
-
(rule rule "3"
|
20
|
-
(first "[")
|
21
|
-
(follow "@pass" "@terminals" "[" _eof)
|
22
|
-
(seq lhs "::=" expression))
|
19
|
+
(rule rule "3" (first LHS) (follow "@pass" "@terminals" LHS _eof) (seq LHS expression))
|
23
20
|
(rule _rule_1 "3.1"
|
24
|
-
(first "
|
25
|
-
(follow "@pass" "@terminals"
|
26
|
-
(seq "::=" expression))
|
27
|
-
(rule _rule_2 "3.2"
|
28
|
-
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2)
|
29
|
-
(follow "@pass" "@terminals" "[" _eof)
|
21
|
+
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 SYMBOL)
|
22
|
+
(follow "@pass" "@terminals" LHS _eof)
|
30
23
|
(seq expression))
|
31
|
-
(rule
|
32
|
-
|
33
|
-
|
34
|
-
(rule _lhs_3 "4.3" (first SYMBOL) (follow "::=") (seq SYMBOL))
|
35
|
-
(rule expression "5"
|
36
|
-
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2)
|
37
|
-
(follow ")" "@pass" "@terminals" "[" _eof)
|
24
|
+
(rule expression "4"
|
25
|
+
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 SYMBOL)
|
26
|
+
(follow ")" "@pass" "@terminals" LHS _eof)
|
38
27
|
(seq alt))
|
39
|
-
(rule alt "
|
40
|
-
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2)
|
41
|
-
(follow ")" "@pass" "@terminals"
|
28
|
+
(rule alt "5"
|
29
|
+
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 SYMBOL)
|
30
|
+
(follow ")" "@pass" "@terminals" LHS _eof)
|
42
31
|
(seq seq _alt_1))
|
43
|
-
(rule _alt_1 "
|
32
|
+
(rule _alt_1 "5.1"
|
44
33
|
(first _eps "|")
|
45
|
-
(follow ")" "@pass" "@terminals"
|
34
|
+
(follow ")" "@pass" "@terminals" LHS _eof)
|
46
35
|
(alt _empty _alt_3))
|
47
|
-
(rule _alt_2 "
|
36
|
+
(rule _alt_2 "5.2"
|
48
37
|
(first "|")
|
49
|
-
(follow ")" "@pass" "@terminals"
|
38
|
+
(follow ")" "@pass" "@terminals" LHS _eof "|")
|
50
39
|
(seq "|" seq))
|
51
|
-
(rule _alt_3 "
|
40
|
+
(rule _alt_3 "5.3"
|
52
41
|
(first "|")
|
53
|
-
(follow ")" "@pass" "@terminals"
|
42
|
+
(follow ")" "@pass" "@terminals" LHS _eof)
|
54
43
|
(seq _alt_2 _alt_1))
|
55
|
-
(rule _alt_4 "
|
44
|
+
(rule _alt_4 "5.4"
|
56
45
|
(first _eps "|")
|
57
|
-
(follow ")" "@pass" "@terminals"
|
46
|
+
(follow ")" "@pass" "@terminals" LHS _eof)
|
58
47
|
(seq _alt_1))
|
59
|
-
(rule _alt_5 "
|
48
|
+
(rule _alt_5 "5.5"
|
60
49
|
(first _eps "|")
|
61
|
-
(follow ")" "@pass" "@terminals"
|
50
|
+
(follow ")" "@pass" "@terminals" LHS _eof)
|
62
51
|
(seq _alt_1))
|
63
|
-
(rule _alt_6 "
|
64
|
-
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2)
|
65
|
-
(follow ")" "@pass" "@terminals"
|
52
|
+
(rule _alt_6 "5.6"
|
53
|
+
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 SYMBOL)
|
54
|
+
(follow ")" "@pass" "@terminals" LHS _eof "|")
|
66
55
|
(seq seq))
|
67
|
-
(rule seq "
|
68
|
-
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2)
|
69
|
-
(follow ")" "@pass" "@terminals"
|
56
|
+
(rule seq "6"
|
57
|
+
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 SYMBOL)
|
58
|
+
(follow ")" "@pass" "@terminals" LHS _eof "|")
|
70
59
|
(seq diff _seq_1))
|
71
|
-
(rule _seq_1 "
|
72
|
-
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 _eps)
|
73
|
-
(follow ")" "@pass" "@terminals"
|
60
|
+
(rule _seq_1 "6.1"
|
61
|
+
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 SYMBOL _eps)
|
62
|
+
(follow ")" "@pass" "@terminals" LHS _eof "|")
|
74
63
|
(alt _empty _seq_2))
|
75
|
-
(rule _seq_2 "
|
76
|
-
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2)
|
77
|
-
(follow ")" "@pass" "@terminals"
|
64
|
+
(rule _seq_2 "6.2"
|
65
|
+
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 SYMBOL)
|
66
|
+
(follow ")" "@pass" "@terminals" LHS _eof "|")
|
78
67
|
(seq diff _seq_1))
|
79
|
-
(rule _seq_3 "
|
80
|
-
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 _eps)
|
81
|
-
(follow ")" "@pass" "@terminals"
|
68
|
+
(rule _seq_3 "6.3"
|
69
|
+
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 SYMBOL _eps)
|
70
|
+
(follow ")" "@pass" "@terminals" LHS _eof "|")
|
82
71
|
(seq _seq_1))
|
83
|
-
(rule _seq_4 "
|
84
|
-
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 _eps)
|
85
|
-
(follow ")" "@pass" "@terminals"
|
72
|
+
(rule _seq_4 "6.4"
|
73
|
+
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 SYMBOL _eps)
|
74
|
+
(follow ")" "@pass" "@terminals" LHS _eof "|")
|
86
75
|
(seq _seq_1))
|
87
|
-
(rule diff "
|
88
|
-
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2)
|
89
|
-
(follow
|
90
|
-
|
76
|
+
(rule diff "7"
|
77
|
+
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 SYMBOL)
|
78
|
+
(follow "(" ")" "@pass" "@terminals" ENUM HEX LHS O_ENUM O_RANGE RANGE
|
79
|
+
STRING1 STRING2 SYMBOL _eof "|" )
|
91
80
|
(seq postfix _diff_1))
|
92
|
-
(rule _diff_1 "
|
81
|
+
(rule _diff_1 "7.1"
|
93
82
|
(first "-" _eps)
|
94
|
-
(follow
|
95
|
-
|
96
|
-
(alt _empty
|
97
|
-
(rule _diff_2 "
|
83
|
+
(follow "(" ")" "@pass" "@terminals" ENUM HEX LHS O_ENUM O_RANGE RANGE
|
84
|
+
STRING1 STRING2 SYMBOL _eof "|" )
|
85
|
+
(alt _empty _diff_2))
|
86
|
+
(rule _diff_2 "7.2"
|
98
87
|
(first "-")
|
99
|
-
(follow
|
100
|
-
|
88
|
+
(follow "(" ")" "@pass" "@terminals" ENUM HEX LHS O_ENUM O_RANGE RANGE
|
89
|
+
STRING1 STRING2 SYMBOL _eof "|" )
|
101
90
|
(seq "-" postfix))
|
102
|
-
(rule _diff_3 "
|
103
|
-
(first "-")
|
104
|
-
(follow
|
105
|
-
"(" ")" "@pass" "@terminals" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 "[" _eof "|" )
|
106
|
-
(seq _diff_2 _diff_1))
|
107
|
-
(rule _diff_4 "8.4"
|
108
|
-
(first "-" _eps)
|
109
|
-
(follow
|
110
|
-
"(" ")" "@pass" "@terminals" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 "[" _eof "|" )
|
111
|
-
(seq _diff_1))
|
112
|
-
(rule _diff_5 "8.5"
|
91
|
+
(rule _diff_3 "7.3"
|
113
92
|
(first "-" _eps)
|
114
|
-
(follow
|
115
|
-
|
93
|
+
(follow "(" ")" "@pass" "@terminals" ENUM HEX LHS O_ENUM O_RANGE RANGE
|
94
|
+
STRING1 STRING2 SYMBOL _eof "|" )
|
116
95
|
(seq _diff_1))
|
117
|
-
(rule
|
118
|
-
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2)
|
119
|
-
(follow
|
120
|
-
|
96
|
+
(rule _diff_4 "7.4"
|
97
|
+
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 SYMBOL)
|
98
|
+
(follow "(" ")" "@pass" "@terminals" ENUM HEX LHS O_ENUM O_RANGE RANGE
|
99
|
+
STRING1 STRING2 SYMBOL _eof "|" )
|
121
100
|
(seq postfix))
|
122
|
-
(rule postfix "
|
123
|
-
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2)
|
124
|
-
(follow
|
125
|
-
|
101
|
+
(rule postfix "8"
|
102
|
+
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 SYMBOL)
|
103
|
+
(follow "(" ")" "-" "@pass" "@terminals" ENUM HEX LHS O_ENUM O_RANGE RANGE
|
104
|
+
STRING1 STRING2 SYMBOL _eof "|" )
|
126
105
|
(seq primary _postfix_1))
|
127
|
-
(rule _postfix_1 "
|
128
|
-
(first _eps
|
129
|
-
(follow
|
130
|
-
|
131
|
-
(alt _empty
|
132
|
-
(
|
133
|
-
|
134
|
-
(
|
135
|
-
|
136
|
-
"(" ")" "-" "@pass" "@terminals" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 "[" _eof "|" )
|
106
|
+
(rule _postfix_1 "8.1"
|
107
|
+
(first POSTFIX _eps)
|
108
|
+
(follow "(" ")" "-" "@pass" "@terminals" ENUM HEX LHS O_ENUM O_RANGE RANGE
|
109
|
+
STRING1 STRING2 SYMBOL _eof "|" )
|
110
|
+
(alt _empty POSTFIX))
|
111
|
+
(rule _postfix_2 "8.2"
|
112
|
+
(first POSTFIX _eps)
|
113
|
+
(follow "(" ")" "-" "@pass" "@terminals" ENUM HEX LHS O_ENUM O_RANGE RANGE
|
114
|
+
STRING1 STRING2 SYMBOL _eof "|" )
|
137
115
|
(seq _postfix_1))
|
138
|
-
(rule primary "
|
139
|
-
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2)
|
140
|
-
(follow
|
141
|
-
|
142
|
-
(alt HEX RANGE ENUM O_RANGE O_ENUM STRING1 STRING2 _primary_1))
|
143
|
-
(rule _primary_1 "
|
116
|
+
(rule primary "9"
|
117
|
+
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 SYMBOL)
|
118
|
+
(follow "(" ")" "-" "@pass" "@terminals" ENUM HEX LHS O_ENUM O_RANGE POSTFIX
|
119
|
+
RANGE STRING1 STRING2 SYMBOL _eof "|" )
|
120
|
+
(alt HEX SYMBOL RANGE ENUM O_RANGE O_ENUM STRING1 STRING2 _primary_1))
|
121
|
+
(rule _primary_1 "9.1"
|
144
122
|
(first "(")
|
145
|
-
(follow
|
146
|
-
|
123
|
+
(follow "(" ")" "-" "@pass" "@terminals" ENUM HEX LHS O_ENUM O_RANGE POSTFIX
|
124
|
+
RANGE STRING1 STRING2 SYMBOL _eof "|" )
|
147
125
|
(seq "(" expression ")"))
|
148
|
-
(rule _primary_2 "
|
149
|
-
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2)
|
150
|
-
(follow
|
151
|
-
|
126
|
+
(rule _primary_2 "9.2"
|
127
|
+
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 SYMBOL)
|
128
|
+
(follow "(" ")" "-" "@pass" "@terminals" ENUM HEX LHS O_ENUM O_RANGE POSTFIX
|
129
|
+
RANGE STRING1 STRING2 SYMBOL _eof "|" )
|
152
130
|
(seq expression ")"))
|
153
|
-
(rule _primary_3 "
|
131
|
+
(rule _primary_3 "9.3"
|
154
132
|
(first ")")
|
155
|
-
(follow
|
156
|
-
|
133
|
+
(follow "(" ")" "-" "@pass" "@terminals" ENUM HEX LHS O_ENUM O_RANGE POSTFIX
|
134
|
+
RANGE STRING1 STRING2 SYMBOL _eof "|" )
|
157
135
|
(seq ")"))
|
158
|
-
(rule pass "
|
136
|
+
(rule pass "10"
|
159
137
|
(first "@pass")
|
160
|
-
(follow "@pass" "@terminals"
|
161
|
-
(seq "@pass"
|
162
|
-
(
|
163
|
-
(
|
164
|
-
(
|
165
|
-
(
|
166
|
-
|
167
|
-
(rule _pass_11 "11.11"
|
168
|
-
(first _pass_10)
|
169
|
-
(follow "#" "/*" "//" "@pass" "@terminals" "[" _eof _pass_5)
|
170
|
-
(seq _pass_10 _pass_9))
|
171
|
-
(rule _pass_12 "11.12" (first "*" _eps _pass_15) (follow "*/") (alt _empty _pass_14))
|
172
|
-
(rule _pass_13 "11.13"
|
173
|
-
(first "*" _pass_15)
|
174
|
-
(follow "*" "*/" _pass_15)
|
175
|
-
(alt _pass_15 _pass_16))
|
176
|
-
(rule _pass_14 "11.14" (first "*" _pass_15) (follow "*/") (seq _pass_13 _pass_12))
|
177
|
-
(terminal _pass_15 "11.15" (range "^*"))
|
178
|
-
(rule _pass_16 "11.16" (first "*") (follow "*" "*/" _pass_15) (seq "*" _pass_17))
|
179
|
-
(terminal _pass_17 "11.17" (range "^/"))
|
180
|
-
(rule _pass_18 "11.18"
|
181
|
-
(first "#" "/*" "//" _pass_5)
|
182
|
-
(follow "@pass" "@terminals" "[" _eof)
|
183
|
-
(seq _pass_1))
|
184
|
-
(rule _pass_19 "11.19"
|
185
|
-
(first "#" "/*" "//" _eps _pass_5)
|
186
|
-
(follow "@pass" "@terminals" "[" _eof)
|
187
|
-
(seq _pass_3))
|
188
|
-
(rule _pass_20 "11.20"
|
189
|
-
(first "#" "/*" "//" _eps _pass_5)
|
190
|
-
(follow "@pass" "@terminals" "[" _eof)
|
191
|
-
(seq _pass_3))
|
192
|
-
(rule _pass_2 "11.2"
|
193
|
-
(first "#" "/*" "//" _pass_5)
|
194
|
-
(follow "#" "/*" "//" "@pass" "@terminals" "[" _eof _pass_5)
|
195
|
-
(alt _pass_5 _pass_6 _pass_7))
|
196
|
-
(rule _pass_21 "11.21"
|
197
|
-
(first _eps _pass_10)
|
198
|
-
(follow "#" "/*" "//" "@pass" "@terminals" "[" _eof _pass_5)
|
199
|
-
(seq _pass_9))
|
200
|
-
(rule _pass_22 "11.22"
|
201
|
-
(first _eps _pass_10)
|
202
|
-
(follow "#" "/*" "//" "@pass" "@terminals" "[" _eof _pass_5)
|
203
|
-
(seq _pass_9))
|
204
|
-
(rule _pass_23 "11.23"
|
205
|
-
(first "*" "*/" _pass_15)
|
206
|
-
(follow "#" "/*" "//" "@pass" "@terminals" "[" _eof _pass_5)
|
207
|
-
(seq _pass_12 "*/"))
|
208
|
-
(rule _pass_24 "11.24" (first "*" _eps _pass_15) (follow "*/") (seq _pass_12))
|
209
|
-
(rule _pass_25 "11.25" (first _pass_17) (follow "*" "*/" _pass_15) (seq _pass_17))
|
210
|
-
(rule _pass_26 "11.26"
|
211
|
-
(first "*/")
|
212
|
-
(follow "#" "/*" "//" "@pass" "@terminals" "[" _eof _pass_5)
|
213
|
-
(seq "*/"))
|
214
|
-
(rule _pass_3 "11.3"
|
215
|
-
(first "#" "/*" "//" _eps _pass_5)
|
216
|
-
(follow "@pass" "@terminals" "[" _eof)
|
217
|
-
(alt _empty _pass_4))
|
218
|
-
(rule _pass_4 "11.4"
|
219
|
-
(first "#" "/*" "//" _pass_5)
|
220
|
-
(follow "@pass" "@terminals" "[" _eof)
|
221
|
-
(seq _pass_2 _pass_3))
|
222
|
-
(terminal _pass_5 "11.5" (range "#x20\\t\\r\\n"))
|
223
|
-
(rule _pass_6 "11.6"
|
224
|
-
(first "#" "//")
|
225
|
-
(follow "#" "/*" "//" "@pass" "@terminals" "[" _eof _pass_5)
|
226
|
-
(seq _pass_8 _pass_9))
|
227
|
-
(rule _pass_7 "11.7"
|
228
|
-
(first "/*")
|
229
|
-
(follow "#" "/*" "//" "@pass" "@terminals" "[" _eof _pass_5)
|
230
|
-
(seq "/*" _pass_12 "*/"))
|
231
|
-
(rule _pass_8 "11.8"
|
232
|
-
(first "#" "//")
|
233
|
-
(follow "#" "/*" "//" "@pass" "@terminals" "[" _eof _pass_10 _pass_5)
|
234
|
-
(alt "#" "//"))
|
235
|
-
(rule _pass_9 "11.9"
|
236
|
-
(first _eps _pass_10)
|
237
|
-
(follow "#" "/*" "//" "@pass" "@terminals" "[" _eof _pass_5)
|
238
|
-
(alt _empty _pass_11))
|
138
|
+
(follow "@pass" "@terminals" LHS _eof)
|
139
|
+
(seq "@pass" expression))
|
140
|
+
(rule _pass_1 "10.1"
|
141
|
+
(first "(" ENUM HEX O_ENUM O_RANGE RANGE STRING1 STRING2 SYMBOL)
|
142
|
+
(follow "@pass" "@terminals" LHS _eof)
|
143
|
+
(seq expression))
|
144
|
+
(terminal LHS "11" (seq ENUM SYMBOL "::="))
|
239
145
|
(terminal SYMBOL "12" (plus (alt (range "a-z") (range "A-Z") (range "0-9") "_" ".")))
|
240
|
-
(terminal HEX "13"
|
146
|
+
(terminal HEX "13"
|
147
|
+
(seq "#x"
|
148
|
+
(alt (range "0-9") (range "a-f") (range "A-F"))
|
149
|
+
(alt (range "0-9") (range "a-f") (range "A-F"))) )
|
241
150
|
(terminal RANGE "14" (seq "[" CHAR "-" CHAR "]"))
|
242
151
|
(terminal ENUM "15" (seq "[" (plus CHAR) "]"))
|
243
152
|
(terminal O_RANGE "16" (seq "[^" CHAR "-" CHAR "]"))
|
244
153
|
(terminal O_ENUM "17" (seq "[^" (plus CHAR) "]"))
|
245
|
-
(terminal STRING1 "18" (seq "\"" (star (
|
246
|
-
(terminal STRING2 "19" (seq "'" (star (
|
247
|
-
(terminal CHAR "20"
|
154
|
+
(terminal STRING1 "18" (seq "\"" (star (alt CHAR (range "\t'[]()-"))) "\""))
|
155
|
+
(terminal STRING2 "19" (seq "'" (star (alt CHAR (range "\t\"[]()-"))) "'"))
|
156
|
+
(terminal CHAR "20"
|
157
|
+
(alt HEX (seq "\\" (range "\\trn'\"[]()-")) (range "^\t\r\n'\"[]()-")))
|
158
|
+
(terminal POSTFIX "21" (range "?*+"))
|
159
|
+
(terminal PASS "22"
|
160
|
+
(plus
|
161
|
+
(alt
|
162
|
+
(range "#x20\t\r\n")
|
163
|
+
(seq (alt "#" "//") (star (range "^\r\n")))
|
164
|
+
(seq "/*" (star (alt (opt (seq "*" (range "^/"))) (range "^*"))) "*/")) )) )
|