Я пытаюсь использовать Parse::RecDescent
сделать синтаксический анализатор, который может анализировать скобки и унарный оператор ?
.Разбор строки с вложенными круглыми скобками с использованием Parse :: RecDescent
То, что я до сих пор не удается, когда я создаю анализатор, потому что правило expression
осталось рекурсией:
use strict;
use warnings;
use Parse::RecDescent;
my $test = <<END;
((foo)? bar)
END
my $grammar = q(
parse: expression(s)
expression: string | parend | expression(s)
parend : "(" (string | expression) ")" /\??/
string : /\w+/ /\??/
);
my $parser = Parse::RecDescent->new($grammar);
my $result = $parser->parse($test);
if($result){
print $result;
}else{
print STDERR "Invalid grammar\n";
}
Что/Z/для? –
Обновлено сообщение как обещано. – ikegami
oops, это должно быть '/ \ Z /'. '/ \ Z /' состоит в том, чтобы убедиться, что после ваших выражений нет мусора. Рассмотрим вход '(foo)) bar'. Без '/ \ Z /' неправильный ') bar' будет бесшумно игнорироваться. – ikegami