From: Jeff Ober Date: Fri, 10 Jan 2020 18:36:14 +0000 (-0500) Subject: Apparently inline tables are forbidden to have newlines in them. Who knew? X-Git-Tag: nailing-cargo/1.0.0~234^2~55 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=c1b76ca6ebb9f5def201a0c7198abb55ff6b2b12;p=nailing-cargo.git Apparently inline tables are forbidden to have newlines in them. Who knew? --- diff --git a/lib/TOML/Tiny/Grammar.pm b/lib/TOML/Tiny/Grammar.pm index 03fc43c..784b53a 100644 --- a/lib/TOML/Tiny/Grammar.pm +++ b/lib/TOML/Tiny/Grammar.pm @@ -58,16 +58,8 @@ our $TOML = qr{ (? (?&Key) (?&WS) = (?&WS) (?&Value)) (? (?&Key) (?&WS) = (?&WS) (?&Value) (?&WS) (?&NL)) - (? - (?&WS) - [,] - (?&WS) - (?&NLSeq)? - (?&WS) - ) - (? - (?&KeyValuePair) (?&InlineTableSep) (?&KeyValuePairList)? + (?&KeyValuePair) (?&WS) [,] (?&WS) (?&KeyValuePairList)? | (?&KeyValuePair) ) diff --git a/lib/TOML/Tiny/Parser.pm b/lib/TOML/Tiny/Parser.pm index ff2f753..daf83c5 100644 --- a/lib/TOML/Tiny/Parser.pm +++ b/lib/TOML/Tiny/Parser.pm @@ -33,7 +33,8 @@ sub new { sub next_token { my $self = shift; return unless $self->{tokenizer}; - $self->{tokenizer}->next_token; + my $token = $self->{tokenizer}->next_token; + return $token; } sub parse { @@ -85,7 +86,7 @@ $src sub expect_type { my ($self, $token, $expected) = @_; - my $actual = $token->type; + my $actual = eval{ $token->type }; use Carp; confess $@ if $@; $self->parse_error($token, "expected $expected, but found $actual") unless $actual eq $expected; } @@ -144,16 +145,23 @@ sub parse_table { my $token = shift // $self->next_token; $self->expect_type($token, 'table'); $self->push_keys($token); - - my $node = $self->scan_to_key([$self->get_keys]); + $self->scan_to_key([$self->get_keys]); TOKEN: while (my $token = $self->next_token) { for ($token->type) { + next TOKEN when /EOL/; + when (/key/) { $self->expect_type($self->next_token, 'assign'); $self->push_keys($token); $self->set_keys; $self->pop_keys; + + if (my $eol = $self->next_token) { + $self->expect_type($eol, 'EOL'); + } else { + return; + } } when (/array_table/) { @@ -189,6 +197,8 @@ sub parse_array_table { TOKEN: while (my $token = $self->next_token) { for ($token->type) { + next TOKEN when /EOL/; + when (/key/) { $self->expect_type($self->next_token, 'assign'); $self->push_keys($token); @@ -282,6 +292,7 @@ sub parse_inline_array { TOKEN: while (my $token = $self->next_token) { for ($token->type) { next TOKEN when /comma/; + next TOKEN when /EOL/; last TOKEN when /inline_array_close/; default{ diff --git a/lib/TOML/Tiny/Tokenizer.pm b/lib/TOML/Tiny/Tokenizer.pm index 46c9a06..60b1b5c 100644 --- a/lib/TOML/Tiny/Tokenizer.pm +++ b/lib/TOML/Tiny/Tokenizer.pm @@ -56,6 +56,7 @@ sub next_token { for ($self->{source}) { when (/\G (?&NL) $TOML/xgc) { ++$self->{line}; + $token = $self->_make_token('EOL'); } when (/\G (?&WSChar)+ $TOML/xgc) {