Эта тема очень сложная. Вы можете поискать алгоритмы синтаксического анализа в Google и получить много подробных материалов.
В основном:
- Чем меньше неясностей необходимо устранить, тем быстрее процесс синтаксического анализа.
- Чем больше токенов нужно рассмотреть, прежде чем принимать решение, тем сложнее оно становится.
Например:
когда анализатор JS видит functionключевое слово в этом коде: function xyz(a, b) {}ключевое слово function является неоднозначным. Сначала он должен обработать следующий токен xyzи увидеть, что это идентификатор, прежде чем он сможет решить, что это объявление функции.
Тем не менее, если следующая лексема были (мы имеем дело с функцией литерала: function(a, b) {}. Это требует, чтобы синтаксический анализатор вел себя очень по-разному, поэтому в синтаксическом анализаторе было больше кода, что замедляло его выполнение.
Если бы были разные ключевые слова для этих двух целей, не было бы никакой двусмысленности:
function_decl xyz(a, b, c) {} а также function_lit(a, b, c) {}
Однако никто не хотел бы писать на таком языке. Но WebAssembly не должен быть написан от руки. Это позволяет адаптировать язык к машинам, а не к людям.