Я заканчиваю свой ECMAScript 5.1/JavaScriptgrammar for JavaCC. Я выполнил все жетоны и постановления в соответствии со спецификацией.Как реализовать автоматическую вставку точки с запятой JavaScript в JavaCC?
Теперь у меня возникает большой вопрос, который я не знаю, как решить.
JavaScript имеет этот хороший функцию автоматической вставки точек с запятой:
What are the rules for JavaScript's automatic semicolon insertion (ASI)?
К quote the specifications, правила:
Есть три основных правила точкой с запятой вставка:
Когда, как программа анализируется слева направо, маркер (называемый токеном-нарушителем) встречается, что не допускается любым производства грамматики, то точка с запятой автоматически вставляется перед токеном-нарушителем если один или несколько из следующих условий верно:
- токен-нарушитель отделен от предыдущего токена по меньшей мере, одним КонцомСтроки.
- Оскорбительный токен
}
.Когда, как программа анализируется слева направо, конец входного потока токенов, и парсер не в состоянии разбора лексем входного потока как единственный нетерминал Программа, затем точка с запятой автоматически вставлена в конец входного потока .
Когда, как программа анализируются слева направо, знак встречается, что допускаются некоторым производством грамматики, но производства является ограниченным производством и маркер будет первым маркером для терминал или нетерминал сразу после аннотацию
[no LineTerminator here]
в пределах ограниченного производства (и, следовательно, такой маркер называется ограниченный маркером), а ограничивается маркер отделен от предыдущих маркеров, по меньшей мере, одинLineTerminator
, то точка с запятой автоматически вставлен перед ограниченным токеном .Однако, есть дополнительное условие наиважнейшая на предыдущих правилах: точка с запятой никогда не вставляется автоматически, если точку с запятой затем будет распознана как пустое заявление или если точка с запятой станет один из двух точки с запятой в заголовке оператора (см. 12.6.3).
Как я мог реализовать это с помощью JavaCC?
Замкнутой вещь ответа я нашел до сих пор является this grammar из Dojo Toolkit, который имеет JAVACODE
части под названием insertSemiColon
посвященной задачу. Но я не вижу, что этот метод называется где угодно (ни в грамматике, ни во всем коде jslinker).
Как я могу подойти к этой проблеме с JavaCC?
Смотрите также вопрос: (. Нет ответа там)
вопрос из комментариев:
Правильно ли сказать, что точки с запятой нужно вставлять только там, где синтаксически разрешены точки с запятой?
Я думаю, что было бы правильно сказать, что точка с запятой должен быть вставлен только там, где точка с запятой синтаксически требуется.
Соответствующая часть здесь §7.9:
7,9 Автоматической Запятая Вставка
Некоторые ECMAScript заявление (пустой оператор, переменное заявление, выражение оператор, то, в то время как заявления, продолжить заявление, заявление перерыва , return statement и оператор throw) должны быть завершены точкой с запятой. Такие точки с запятой могут всегда отображаться явно в исходном тексте. Однако для удобства такие точки с запятой могут быть опущены из исходного текста в определенных ситуациях. Эти ситуации описаны, говоря, что точки с запятой автоматически вставлены в токен исходного кода поток в этих ситуациях.
Давайте возьмем return
заявление, например:
ReturnStatement :
return ;
return [no LineTerminator here] Expression ;
Так (из моего понимания) синтаксически точка с запятой требуется, а не только позволили (как в вашем вопросе).
Правильно ли сказать, что точка с запятой должен быть вставлен только там, где точка с запятой синтаксически разрешено? –
@ TheodoreNorvell Я обновил свой вопрос, не могли бы вы увидеть обновление? Спасибо. – lexicore
См. Также: http://stackoverflow.com/questions/15068782/automatic-semicolon-insertion-in-javascript-without-parsing – lexicore