Nearley Tokenizer против правил
Я довольно новичок в чуть ли не в .js, и я хотел бы знать, что токенизаторы / лексеры делают по сравнению с правилами, согласно веб-сайту:
По умолчанию nearley разбивает входные данные на поток символов. Это называется анализом без сканера. Токенайзер разбивает входные данные на поток больших единиц, называемых токенами. Это происходит на отдельной стадии перед разбором. Например, токенизатор может конвертировать
512 + 10
в["512", "+", "10"]
: обратите внимание, как он удаляет пробелы и объединяет многозначные числа в одно число.
Разве это не было бы так же, как:
Math -> Number _ "+" _ Number
Number -> [0-9]:+
Я не понимаю, какова цель лексеров. Я вижу, что в этом случае правила всегда применимы и лексеры не нужны.
1 ответ
Покопавшись с ними, я узнал об использовании токенизаторов, скажем, у нас было следующее:
Keyword -> "if"|"else"
Identifier -> [a-zA-Z_]+
Это не сработает, если мы попытаемся скомпилировать это, мы получим неоднозначную грамматику, "если" будет соответствовать как ключевое слово, так и идентификатор, однако токенизатор:
{
"keyword": /if|else/
"identifier": /[a-zA-Z_]+/
}
Попытка скомпилировать это не приведет к неоднозначной грамматике, потому что токенизаторы умны (по крайней мере, тот, который показан в этом примере, это Moo).