Как реализовать JavaScript автоматическую вставку точек с запятой в JavaCC?

Я заканчиваюECMAScript 5.1 / JavaScript грамматика для JavaCC, Я сделал все токены и постановки в соответствии со спецификацией.

Теперь передо мной стоит большой вопрос, который я не знаю, как решить.

JavaScript есть этоотлично особенность автоматической вставки точек с запятой:

Каковы правила автоматической вставки точек с запятой в JavaScript (ASI)?

кпроцитировать спецификацииПравила таковы:

Существует три основных правила вставки точек с запятой:

Когда при синтаксическом анализе программы слева направо обнаруживается токен (называемый токеном-нарушителем), который не допускается никаким производством грамматики, тогда точка с запятой автоматически вставляется перед токеном-нарушителем, если один или несколько из следующих условия верны:

Токен-нарушитель отделен от предыдущего токена хотя бы одним LineTerminator.Ложный токен}.

Когда, когда программа анализируется слева направо, встречается конец входного потока токенов, и анализатор не может проанализировать входной поток токенов как одну завершенную программу ECMAScript, тогда точка с запятой автоматически вставляется в конце входной поток.

Когда, когда программа анализируется слева направо, встречается токен, который допускается некоторым производством грамматики, но производство является ограниченным производством, и токен будет первым токеном для терминала или нетерминала, следующего сразу за аннотацией.[no LineTerminator here] в ограниченном производстве (и поэтому такой токен называется ограниченным токеном), и ограниченный токен отделен от предыдущего токена по крайней мере однимLineTerminator, затем точка с запятой автоматически вставляется перед ограниченным токеном.

Однако в предыдущих правилах существует дополнительное переопределяющее условие: точка с запятой никогда не вставляется автоматически, если точка с запятой будет затем проанализирована как пустая инструкция, или если эта точка с запятой станет одной из двух точек с запятой в заголовке инструкции for (см.12.6.3).

Как я могу реализовать это с JavaCC?

Закрытие к ответу, который я нашел до сих пор,эта грамматика из инструментария Dojo, который имеетJAVACODE часть называетсяinsertSemiColon посвященный задаче. Но я не вижу, чтобы этот метод вызывался нигде (ни в грамматике, ни в целомjslinker код).

Как я могу подойти к этой проблеме с JavaCC?

Смотрите также этот вопрос:

грамматика javascript и автоматическая вставка точки с запятой

(Там нет ответа.)

Вопрос из комментариев:

Правильно ли говорить, что точки с запятой нужно вставлять только там, где синтаксически разрешены точки с запятой?

Я думаю, что было бы правильно сказать, что точки с запятой должны быть вставлены только там, где точки с запятой синтаксическитребуется.

Соответствующая часть здесь - §7.9:

7.9 Автоматическая вставка точек с запятой

Некоторые операторы ECMAScript (пустой оператор, оператор переменной, оператор выражения, оператор do-while, оператор continue, оператор break, оператор return и оператор throw) должны заканчиваться точкой с запятой. Такие точки с запятой всегда могут быть явно указаны в исходном тексте. Однако для удобства такие точки с запятой могут быть исключены из исходного текста в определенных ситуациях. Эти ситуации описываются тем, что в этих ситуациях точки с запятой автоматически вставляются в поток токенов исходного кода.

Давайте возьмемreturn утверждение, например:

ReturnStatement :
    return ;
    return [no LineTerminator here] Expression ;

Итак (из моего понимания)синтаксически точка с запятойтребуется, не простопозволил (как в вашем вопросе).

Ответы на вопрос(1)

Ваш ответ на вопрос