2016-12-05 3 views

ответ

1

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

Отъезд this comment from the source.

// We allow arbitrary expressions here, even though the grammar only allows string 
// literals. We check to ensure that it is only a string literal later in the grammar 
// check pass. 

The text <code>import foo from wat</code>, where <code>wat</code> has a red underline indicating a syntax error (i.e. "String literal expected.")

Весь текст в файле должен принадлежать к некоторому узлу в соответствующем дереве. В случаях, подобных приведенным выше, мы хотим сообщить об ошибке на Identifier с именем wat.

Поскольку мы сообщаем ошибки грамматики после разбора, то какое бы выражение оно ни было, оно должно быть на importSpecifier. В противном случае, как мы узнаем, что узел должен был? Контекст того, что он принадлежит ImportDeclaration, позволяет нам знать после разбора, что нам нужно сообщить об ошибке синтаксического анализа.

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

+0

Спасибо, Даниэль. Однако этот комментарий описывает, что делает, но не описывает, почему он это делает. Глядя на код, похоже, что это потому, что «импорт» и «экспорт» используют эту функцию. Может быть, один из способов улучшить его - сделать его универсальной функцией, чтобы вернуть правильный тип? Почему я спрашиваю, потому что это неверно, потому что 'ImportDeclaration.moduleSpecifier' не является' StringLiteral', заставляет людей задаться вопросом, что еще это может быть, и нужно выполнить дополнительный бросок, чтобы получить '.text'. – unional

+0

Могут ли мои правки стать более ясными? –

+0

Я вижу. Вы имеете в виду, что если 'importSpecifier' является' StringLiteral', тогда весь оператор import не будет разбираться, и весь оператор будет ошибкой? В настоящее время мы можем выделить ошибку в выражении 'importSpecifier' и сообщить об ошибке, как на скриншоте. – unional

Смежные вопросы