Покопавшись с ними, я узнал об использовании токенизаторов, скажем, у нас было следующее:
Keyword -> "if"|"else"
Identifier -> [a-zA-Z_]+
Это не сработает, если мы попробуем скомпилировать это, мы получим неоднозначную грамматику, "если" будет сопоставлено как ключевое слово , так и Идентификатор, однако токенизатор:
{
"keyword": /if|else/
"identifier": /[a-zA-Z_]+/
}
Попытка скомпилировать это не приведет к неоднозначной грамматике, потому что токенизаторы умны (по крайней мере, тот, который показан в этом примере, это Moo).