• R/O
  • HTTP
  • SSH
  • HTTPS

提交

標籤
無標籤

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Commit MetaInfo

修訂c5724a598d0e0e376b567fcadc9ead0999225881 (tree)
時間2023-04-03 02:44:20
作者dyknon <dyknon@user...>
Commiterdyknon

Log Message

Remove unneeded "Grammar" file

Change Summary

差異

--- a/lib/Text/Hjson.pm
+++ b/lib/Text/Hjson.pm
@@ -4,9 +4,6 @@ use warnings;
44 use strict;
55 use feature qw(postderef);
66 use Carp;
7-use Text::Hjson::Grammar;
8-
9-our $grammar = "Text::Hjson::Grammar";
107
118 our $ws = qr/[\t\r\n ]/;
129 our $inline_ws = qr/[\t\r ]/;
@@ -102,57 +99,6 @@ sub decode_quoted_string($$){
10299 $str
103100 }
104101
105-sub consume($$$$){
106- my ($self, $what, $in, $at) = @_;
107- croak "unknown grammar: $what" if(!$grammar->can($what));
108- my %g = $grammar->$what();
109- my $act = sub{scalar ($g{act} // sub{})->($self, @_)};
110- if($g{re}){
111- pos($in) = $at;
112- if($in =~ /\G$g{re}/g){
113- (
114- pos($in),
115- $act->([@{^CAPTURE}])
116- )
117- }else{
118- ()
119- }
120- }elsif($g{seq}){
121- my @got;
122- for($g{seq}->@*){
123- ($at, my $read) = $self->consume($_, $in, $at);
124- return () if(!defined $at);
125- push @got, $read;
126- }
127- ($at, $act->(@got))
128- }elsif($g{any}){
129- my ($i, $bt, $read);
130- for $i(0 .. $g{any}->$#*){
131- ($bt, $read) = $self->consume($g{any}[$i], $in, $at);
132- if(defined $bt){
133- return ($bt, $act->($i, $read));
134- }
135- }
136- ()
137- }elsif($g{many}){
138- my $bt;
139- my @got;
140- while(1){
141- ($bt, my $read) = $self->consume($g{many}, $in, $at);
142- last if(!defined $bt);
143- die "infinite loop detected in $what" if($at == $bt);
144- $at = $bt;
145- push @got, $read;
146- }
147- ($at, $act->(@got))
148- }elsif($g{opt}){
149- my ($bt, $read) = $self->consume($g{opt}, $in, $at);
150- ($bt//$at, $act->($read))
151- }else{
152- die "broken grammar";
153- }
154-}
155-
156102 sub consume_value($$$){
157103 my ($self, $in, $at) = @_;
158104 my $s = substr($in, $at, 1);
--- a/lib/Text/Hjson/Grammar.pm
+++ /dev/null
@@ -1,181 +0,0 @@
1-package Text::Hjson::Grammar;
2-
3-use warnings;
4-use strict;
5-use feature qw(postderef);
6-
7-our $ws = qr/[\t\r\n ]/;
8-our $inline_ws = qr/[\t\r ]/;
9-our $inline = qr/$inline_ws|[^\0-\x20]/;
10-our $any = qr/$ws|[^\0-\x20]/;
11-our $line_comment = qr/(?:#|\/\/)$inline*+/;
12-our $block_comment = qr/\/\*(?:[^*]|\*(?!\/))*+\*\//;
13-our $comment = qr/$line_comment|$block_comment/;
14-our $wsc = qr/(?:$ws|$comment)*+/;
15-our $litend = qr/(?![ \t]*+[^\0-\x20#,\/\[\]{}])/;
16-our $separator = qr/$wsc,|(?:$inline_ws|$comment)*+\n/;
17-our $nonpunct = qr/[^\0-\x20,:\[\]{}]/;
18-
19-sub literal{
20- re => qr/$wsc(true|false|null)$litend/,
21- act => sub{
22- my ($self, $match) = @_;
23- {
24- true => $self->true,
25- false => $self->false,
26- null => $self->null,
27- }->{$match->[0]}
28- }
29-}
30-sub separator{re => qr/$separator/}
31-sub optional_sep{re => qr/$separator?/}
32-# XXX: not docuemnted, but tests say quoteless string
33-# starting with quote is not allowed.
34-sub quoteless_guard{re => qr/$wsc(?!["'])/}
35-sub value{
36- any => [qw(literal object array number string)],
37- act => sub{$_[2]}
38-}
39-sub root{
40- any => [qw(object_member_arr value)],
41- act => sub{$_[2]}
42-}
43-sub object{
44- seq => [qw(begin_object object_inner end_object)],
45- act => sub{$_[2]}
46-}
47-sub begin_object{re => qr/$wsc\{/}
48-sub end_object{re => qr/$wsc\}/}
49-sub object_inner{
50- opt => "object_member_arr",
51- act => sub{
52- my ($self, $match) = @_;
53- $match // $self->object
54- }
55-}
56-sub object_member_arr{
57- seq => [qw(object_member object_members optional_sep)],
58- act => sub{
59- my ($self, $first, $left) = @_;
60- $self->object($first, @$left)
61- }
62-}
63-sub object_member{
64- seq => [qw(object_key object_key_sep value)],
65- act => sub{
66- my ($self, $key, $sep, $val) = @_;
67- [$key, $val]
68- }
69-}
70-sub object_members{
71- many => "separated_object_member",
72- act => sub{shift; [@_]}
73-}
74-sub separated_object_member{
75- seq => [qw(separator object_member)],
76- act => sub{$_[2]}
77-}
78-sub object_key{
79- any => [qw(string_quoted object_key_noquote)],
80- act => sub{$_[2]}
81-}
82-sub object_key_noquote{
83- seq => [qw(quoteless_guard object_key_noquote_body)],
84- act => sub{$_[2]}
85-}
86-sub object_key_noquote_body{
87- re => qr/($nonpunct+)/,
88- act => sub{$_[1][0]}
89-}
90-sub wsc{re => qr/$wsc/}
91-sub object_key_sep{re => qr/$wsc:/}
92-sub array{
93- seq => [qw(begin_array array_inner end_array)],
94- act => sub{$_[2]}
95-}
96-sub begin_array{re => qr/$wsc\[/}
97-sub end_array{re => qr/$wsc\]/}
98-sub array_inner{
99- opt => "array_member_arr",
100- act => sub{
101- my ($self, $match) = @_;
102- $match // $self->array;
103- }
104-}
105-sub array_member_arr{
106- seq => [qw(value array_members optional_sep)],
107- act => sub{
108- my ($self, $first, $left) = @_;
109- $self->array($first, @$left)
110- }
111-}
112-sub array_members{
113- many => "separated_array_member",
114- act => sub{shift; [@_]}
115-}
116-sub separated_array_member{
117- seq => [qw(separator value)],
118- act => sub{$_[2]}
119-}
120-sub number{
121- re => qr/$wsc(-)?+((?:0|[1-9][0-9]*+)(?:\.[0-9]++)?+)(?:[eE]([-+]?+[0-9]++))?+$litend/,
122- act => sub{
123- my ($self, $match) = @_;
124- my $v = $match->[1] * 10**($match->[2] // 0);
125- $match->[0] ? -$v : $v
126- }
127-}
128-sub string{
129- any => [qw(string_multiline string_quoted string_noquote)],
130- act => sub{$_[2]}
131-}
132-# XXX: not in RFC but quote by ' is allowed.
133-sub string_quoted{
134- re => qr/$wsc(["'])((?:(?!\g{1})[^\0-\x1f\\]|\\.)*+)\g{1}/,
135- act => sub{
136- my ($self, $match) = @_;
137- $self->string($self->decode_quoted_string($match->[1]))
138- #$match->[1] =~ s{\\(u(.{4})|.)}{
139- # {
140- # '"' => '"',
141- # "'" => "'",
142- # "\\" => "\\",
143- # "/" => "/",
144- # "b" => "\b",
145- # "f" => "\f",
146- # "n" => "\n",
147- # "r" => "\r",
148- # "t" => "\t",
149- # }->{$1} // chr(hex($2))
150- #}ger;
151- }
152-}
153-sub string_noquote{
154- seq => [qw(quoteless_guard string_noquote_body)],
155- act => sub{$_[2]}
156-}
157-sub string_noquote_body{
158- re => qr/(${nonpunct}(?:\t|[^\0-\x1f])*)/,
159- act => sub{
160- my ($self, $match) = @_;
161- $match->[0] =~ s/$inline_ws*+\z//r;
162- }
163-}
164-sub string_multiline{
165- re => qr/($wsc)'''((?:(?!''')$any)*+)'''/,
166- act => sub{
167- my ($self, $match) = @_;
168- my $indent = length($match->[0] =~ s/.*\n//r);
169- my $s = $match->[1] =~ s/\r//r;
170-
171- # XXX: What is "column"
172- $s =~ s/(?<=\n)${inline_ws}{0,$indent}//g;
173- # XXX: RFC says: Whitespace on the first line is ignored.
174- # my understanding: first line is ignored if it contains only ws.
175- $s =~ s/^$inline_ws*\n//;
176-
177- $s =~ s/\n\z//r
178- }
179-}
180-
181-1;