У меня проблемы с этой мини-грамматикой, которая пытается сопоставить конструкции заголовка, подобные уценке.
role Like-a-word {
regex like-a-word { \S+ }
}
role Span does Like-a-word {
regex span { <like-a-word>[\s+ <like-a-word>]* }
}
grammar Grammar::Headers does Span {
token TOP {^ <header> \v+ $}
token hashes { '#'**1..6 }
regex header {^^ <hashes> \h+ <span> [\h* $0]? $$}
}
Я бы хотел, чтобы он соответствовал ## Easier ##
в качестве заголовка, но вместо этого он принимает ##
как часть span
:
TOP
| header
| | hashes
| | * MATCH "##"
| | span
| | | like-a-word
| | | * MATCH "Easier"
| | | like-a-word
| | | * MATCH "##"
| | | like-a-word
| | | * FAIL
| | * MATCH "Easier ##"
| * MATCH "## Easier ##"
* MATCH "## Easier ##\n"
「## Easier ##
」
header => 「## Easier ##」
hashes => 「##」
span => 「Easier ##」
like-a-word => 「Easier」
like-a-word => 「##」
Проблема в том, что [\h* $0]?
просто не работает, а span
поглощает все доступные слова. Есть идеи?
?
после*
. - person Rahul   schedule 05.01.2018$0
, когда нет позиционных захватов? - person Eugene Barsky   schedule 05.01.2018token
, если вы знаете, что вам нужен один из других вариантов (regex
,rule
иmethod
). - person raiph   schedule 06.01.2018regex
только в том случае, если вы уверены, что вам нужен возврат, потому что возврат часто приводит к тому, что синтаксический анализ выполняется буквально в миллионы раз медленнее, чем необходимо, или еще хуже. Если вы переключите все свои объявленияregex
наtoken
, вы увидите, что ваш код будет продолжать анализироваться правильно (по крайней мере, для вашего пробного ввода ## Easier ##\n), но вполне вероятно, что он будет работать значительно быстрее на больших или сложных входных данных. - person raiph   schedule 06.01.2018like-a-word
, на токен. - person jjmerelo   schedule 08.01.2018