Tôi có ngữ pháp Marpa khá lớn (để phân tích cú pháp XPath) và tôi gặp sự cố với mã thông báo. Tôi tạo ra một ví dụ bẻ tối thiểu dưới đây:Mã thông báo không chính xác với Marpa
use strict;
use warnings;
use Marpa::R2;
my $grammar = Marpa::R2::Scanless::G->new(
{
source => \(<<'END_OF_SOURCE'),
:default ::= action => ::array
:start ::= Start
Start ::= Child DoubleColon Token
DoubleColon ~ '::'
Child ~ 'child'
Token ~
word
| word ':' word
word ~ [\w]+
END_OF_SOURCE
}
);
my $reader = Marpa::R2::Scanless::R->new(
{
grammar => $grammar,
trace_terminals => 1,
}
);
my $input = 'child::book';
$reader->read(\$input);
Kịch bản này in như sau:
Registering character U+0063 as symbol 10: [[\w]]
Registering character U+0063 as symbol 3: [[c]]
Registering character U+0068 as symbol 10: [[\w]]
Registering character U+0068 as symbol 4: [[h]]
Registering character U+0069 as symbol 10: [[\w]]
Registering character U+0069 as symbol 5: [[i]]
Registering character U+006c as symbol 10: [[\w]]
Registering character U+006c as symbol 6: [[l]]
Registering character U+0064 as symbol 10: [[\w]]
Registering character U+0064 as symbol 7: [[d]]
Registering character U+003a as symbol 1: [[\:]]
Rejected lexeme @0-5: Token; value="child"
Accepted lexeme @0-5: Child; value="child"
Registering character U+0062 as symbol 10: [[\w]]
Error in SLIF G1 read: No lexeme found at position 6
* String before error: child::
* The error was at line 1, column 8, and at character 0x0062 'b', ...
* here: book
Tôi muốn đầu vào được tokenized như [Child] [DoubleColon] [word]
. Khi dấu vết đầu cuối hiển thị, chỉ có một ký tự đại tràng được đọc và xử lý. Có vẻ như nó cố gắng để tokenize sự bắt đầu của chuỗi như [word] [':'] [word]
và thất bại một phần thông qua. Lỗi này sẽ không còn bị ném nếu bạn xóa dòng 10 của ngữ pháp (| word ':' word
).
Tôi đã cố tạo ưu tiên cho DoubleColon (:lexeme ~ <DoubleColon> priority > 1
), nhưng điều đó không hiệu quả. Ai đó có thể cho tôi biết phải làm gì để làm cho ngữ pháp này phân tích cú pháp chuỗi đầu vào chính xác không? Nó vẫn cần có khả năng phân tích cú pháp child::ns:book
, v.v.
Nếu bạn muốn kiểm tra điều này với bản sửa lỗi, hãy thử Marpa-R2 2.059_000 vừa tải lên: https://metacpan.org/release/JKEGL/Marpa-R2-2.059_000 –
Tuyệt vời! Tôi không biết tại sao, nhưng tôi đã có vấn đề cài đặt nó bằng tay ('perl Build.PL', vv), nhưng cài đặt với' cpan' làm việc tốt. Bây giờ tôi có một trình phân tích cú pháp XPath đang hoạt động. Woohoo! –
Tuyệt vời! Bản sửa lỗi sẽ được đưa vào bản phát hành CPAN được lập chỉ mục (đầy đủ, không phát triển) trong một vài ngày. –