Грамматика JavaScript: правила цикла for / for? - PullRequest
0 голосов
/ 19 января 2012

Я пишу парсер JavaScript, но грамматические правила для циклов for немного сбивают с толку. Из спецификаций :

'for' LPAREN (
    (expressionNoln)? SEMI (expression)? SEMI (expression)? RPAREN statement
    | 'var' variableDeclarationListNoln SEMI (expression)? SEMI (expression)? RPAREN statement
    | leftHandSideExpression 'in' expression RPAREN statement
    | 'var' variableDeclarationNoln 'in' expression RPAREN statement
    )

Я пытаюсь выяснить, в чем разница между expressionNoln и обычным expression.И, в процессе, выясните, что происходит с variableDeclartionNoln и variableDeclartionListNoln.

Единственное различие, которое я обнаружил, немного ниже, между relationalExpression и relationalExpressionNoln.В последнем правиле отсутствует оператор in.

Правильно ли я это понял или я просто запутался?

Ответы [ 2 ]

1 голос
/ 19 января 2012

Вы правы. Я думаю, что вы сбиты с толку, потому что грамматика ANTLR имеет идентификатор с ошибкой. Это должно быть variableDeclarationListNoIn для "нет в". ANTLR записывает его Noln, используя строчные буквы l вместо прописных I.

Удаление in из выражения важно, чтобы избежать двусмысленности для специального использования in в выражении for.

Кстати, ваш вопрос подразумевает, что указанная вами ссылка является спецификацией. Это не. Это ссылка на пример грамматики ANTLR. Официальный стандарт можно найти здесь: http://www.ecma -international.org / публикации / стандарты / Ecma-262.htm

0 голосов
/ 19 января 2012

Я представляю, что каждая строка представляет следующие for с:

for (i = 0; i < 10; i++) console.log(i);
for (var i = 0; i < 10; i++) console.log(i);
for (i in obj) console.log(i + ': ' + obj[i]);
for (var i in obj) console.log(i + ': ' + obj[i]);

Я не уверен, что означает No Line (что, как я полагаю, это означает).

SEMI = ';'    LPAREN = '('    RPAREN = ')'     ? = optional      | = or
...