diff --git a/examples/bind/performance.amp.html b/examples/bind/performance.amp.html index 21aacfae2b96..a96dfd933142 100644 --- a/examples/bind/performance.amp.html +++ b/examples/bind/performance.amp.html @@ -4012,1005 +4012,1025 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- \ No newline at end of file + diff --git a/extensions/amp-bind/0.1/bind-expr-impl.jison b/extensions/amp-bind/0.1/bind-expr-impl.jison index 4707ffc1a7f5..5da844aa699d 100644 --- a/extensions/amp-bind/0.1/bind-expr-impl.jison +++ b/extensions/amp-bind/0.1/bind-expr-impl.jison @@ -9,40 +9,37 @@ %% \s+ /* skip whitespace */ +"null" return 'NULL' +"true" return 'TRUE' +"false" return 'FALSE' +[0-9]+("."[0-9]+)?\b return 'NUMBER' +[a-zA-Z_][a-zA-Z0-9_]* return 'NAME' +\'[^\']*\' return 'STRING' +\"[^\"]*\" return 'STRING' "+" return '+' "-" return '-' "*" return '*' "/" return '/' -"%" return '%' "&&" return '&&' "||" return '||' +"!=" return '!=' +"==" return '==' "<=" return '<=' "<" return '<' ">=" return '>=' ">" return '>' -"!=" return '!=' -"==" return '==' -"(" return '(' -")" return ')' +"!" return '!' +"?" return '?' +":" return ':' +"%" return '%' "[" return '[' "]" return ']' "{" return '{' "}" return '}' +"(" return '(' +")" return ')' "," return ',' \. return '.' -":" return ':' -"?" return '?' -"!" return '!' -"null" return 'NULL' -"NULL" return 'NULL' -"TRUE" return 'TRUE' -"true" return 'TRUE' -"FALSE" return 'FALSE' -"false" return 'FALSE' -[0-9]+("."[0-9]+)?\b return 'NUMBER' -[a-zA-Z_][a-zA-Z0-9_]* return 'NAME' -\'[^\']*\' return 'STRING' -\"[^\"]*\" return 'STRING' . return 'INVALID' <> return 'EOF' diff --git a/extensions/amp-bind/0.1/bind-expr-impl.js b/extensions/amp-bind/0.1/bind-expr-impl.js index 2644c5907e71..63ee278ad4f1 100644 --- a/extensions/amp-bind/0.1/bind-expr-impl.js +++ b/extensions/amp-bind/0.1/bind-expr-impl.js @@ -1,5 +1,5 @@ /** - * Copyright 2015 The AMP HTML Authors. All Rights Reserved. + * Copyright 2017 The AMP HTML Authors. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,7 +19,8 @@ import {AstNode, AstNodeType} from './bind-expr-defines'; -/* parser generated by jison 0.4.15 */ + +/* parser generated by jison 0.4.17 */ /* Returns a Parser object of the following structure: @@ -119,204 +120,204 @@ break; case 9: this.$ = new AstNode(AstNodeType.NOT, [$$[$0]]); - + break; case 10: this.$ = new AstNode(AstNodeType.UNARY_MINUS, [$$[$0]]); - + break; case 11: this.$ = new AstNode(AstNodeType.UNARY_PLUS, [$$[$0]]); - + break; case 12: this.$ = new AstNode(AstNodeType.PLUS, [$$[$0-2], $$[$0]]); - + break; case 13: this.$ = new AstNode(AstNodeType.MINUS, [$$[$0-2], $$[$0]]); - + break; case 14: this.$ = new AstNode(AstNodeType.MULTIPLY, [$$[$0-2], $$[$0]]); - + break; case 15: this.$ = new AstNode(AstNodeType.DIVIDE, [$$[$0-2], $$[$0]]); - + break; case 16: this.$ = new AstNode(AstNodeType.MODULO, [$$[$0-2], $$[$0]]); - + break; case 17: this.$ = new AstNode(AstNodeType.LOGICAL_AND, [$$[$0-2], $$[$0]]); - + break; case 18: this.$ = new AstNode(AstNodeType.LOGICAL_OR, [$$[$0-2], $$[$0]]); - + break; case 19: this.$ = new AstNode(AstNodeType.LESS_OR_EQUAL, [$$[$0-2], $$[$0]]); - + break; case 20: this.$ = new AstNode(AstNodeType.LESS, [$$[$0-2], $$[$0]]); - + break; case 21: this.$ = new AstNode(AstNodeType.GREATER_OR_EQUAL, [$$[$0-2], $$[$0]]); - + break; case 22: this.$ = new AstNode(AstNodeType.GREATER, [$$[$0-2], $$[$0]]); - + break; case 23: this.$ = new AstNode(AstNodeType.NOT_EQUAL, [$$[$0-2], $$[$0]]); - + break; case 24: this.$ = new AstNode(AstNodeType.EQUAL, [$$[$0-2], $$[$0]]); - + break; case 25: this.$ = new AstNode(AstNodeType.TERNARY, [$$[$0-4], $$[$0-2], $$[$0]]); - + break; case 26: this.$ = new AstNode(AstNodeType.INVOCATION, [$$[$0-3], $$[$0]], $$[$0-1]); - + break; case 27: this.$ = new AstNode(AstNodeType.INVOCATION, [null, $$[$0]], $$[$0-1]) - + break; case 28: this.$ = new AstNode(AstNodeType.ARGS, []); - + break; case 29: this.$ = new AstNode(AstNodeType.ARGS, [$$[$0-1]]); - + break; case 30: this.$ = new AstNode(AstNodeType.MEMBER_ACCESS, [$$[$0-1], $$[$0]]); - + break; case 31: this.$ = new AstNode(AstNodeType.MEMBER, null, $$[$0]); - + break; case 32: this.$ = new AstNode(AstNodeType.MEMBER, [$$[$0-1]]); - + break; case 33: this.$ = new AstNode(AstNodeType.VARIABLE, null, $$[$0]); - + break; case 34: case 35: case 36: case 52: this.$ = $$[$0]; - + break; case 37: const string = yytext.substr(1, yyleng - 2); this.$ = new AstNode(AstNodeType.LITERAL, null, string); - + break; case 38: this.$ = new AstNode(AstNodeType.LITERAL, null, Number(yytext)); - + break; case 39: this.$ = new AstNode(AstNodeType.LITERAL, null, true); - + break; case 40: this.$ = new AstNode(AstNodeType.LITERAL, null, false); - + break; case 41: this.$ = new AstNode(AstNodeType.LITERAL, null, null); - + break; case 42: this.$ = new AstNode(AstNodeType.ARRAY_LITERAL, []); - + break; case 43: this.$ = new AstNode(AstNodeType.ARRAY_LITERAL, [$$[$0-1]]); - + break; case 44: this.$ = new AstNode(AstNodeType.ARRAY, [$$[$0]]); - + break; case 45: case 49: this.$ = $$[$0-2]; this.$.args.push($$[$0]); - + break; case 46: this.$ = new AstNode(AstNodeType.OBJECT_LITERAL, []); - + break; case 47: this.$ = new AstNode(AstNodeType.OBJECT_LITERAL, [$$[$0-1]]); - + break; case 48: this.$ = new AstNode(AstNodeType.OBJECT, [$$[$0]]); - + break; case 50: this.$ = new AstNode(AstNodeType.KEY_VALUE, [$$[$0-2], $$[$0]]); - + break; case 51: this.$ = new AstNode(AstNodeType.LITERAL, null, $$[$0]); - + break; } }, @@ -359,14 +360,14 @@ parse: function parse(input) { lstack.length = lstack.length - n; } _token_stack: - function lex() { + var lex = function () { var token; token = lexer.lex() || EOF; if (typeof token !== 'number') { token = self.symbols_[token] || token; } return token; - } + }; var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; while (true) { state = stack[stack.length - 1]; @@ -797,82 +798,76 @@ var YYSTATE=YY_START; switch($avoiding_name_collisions) { case 0:/* skip whitespace */ break; -case 1:return 15 +case 1:return 43 break; -case 2:return 14 +case 2:return 41 break; -case 3:return 16 +case 3:return 42 break; -case 4:return 17 +case 4:return 40 break; -case 5:return 18 +case 5:return 30 break; -case 6:return 19 +case 6:return 39 break; -case 7:return 20 +case 7:return 39 break; -case 8:return 21 +case 8:return 15 break; -case 9:return 22 +case 9:return 14 break; -case 10:return 23 +case 10:return 16 break; -case 11:return 24 +case 11:return 17 break; -case 12:return 25 +case 12:return 19 break; -case 13:return 26 +case 13:return 20 break; -case 14:return 9 +case 14:return 25 break; -case 15:return 10 +case 15:return 26 break; -case 16:return 34 +case 16:return 21 break; -case 17:return 35 +case 17:return 22 break; -case 18:return 45 +case 18:return 23 break; -case 19:return 46 +case 19:return 24 break; -case 20:return 44 +case 20:return 13 break; -case 21:return 29 +case 21:return 27 break; case 22:return 28 break; -case 23:return 27 -break; -case 24:return 13 -break; -case 25:return 43 -break; -case 26:return 43 +case 23:return 18 break; -case 27:return 41 +case 24:return 34 break; -case 28:return 41 +case 25:return 35 break; -case 29:return 42 +case 26:return 45 break; -case 30:return 42 +case 27:return 46 break; -case 31:return 40 +case 28:return 9 break; -case 32:return 30 +case 29:return 10 break; -case 33:return 39 +case 30:return 44 break; -case 34:return 39 +case 31:return 29 break; -case 35:return 'INVALID' +case 32:return 'INVALID' break; -case 36:return 5 +case 33:return 5 break; } }, -rules: [/^(?:\s+)/,/^(?:\+)/,/^(?:-)/,/^(?:\*)/,/^(?:\/)/,/^(?:%)/,/^(?:&&)/,/^(?:\|\|)/,/^(?:<=)/,/^(?:<)/,/^(?:>=)/,/^(?:>)/,/^(?:!=)/,/^(?:==)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:,)/,/^(?:\.)/,/^(?::)/,/^(?:\?)/,/^(?:!)/,/^(?:null\b)/,/^(?:NULL\b)/,/^(?:TRUE\b)/,/^(?:true\b)/,/^(?:FALSE\b)/,/^(?:false\b)/,/^(?:[0-9]+(\.[0-9]+)?\b)/,/^(?:[a-zA-Z_][a-zA-Z0-9_]*)/,/^(?:'[^\']*')/,/^(?:"[^\"]*")/,/^(?:.)/,/^(?:$)/], -conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],"inclusive":true}} +rules: [/^(?:\s+)/,/^(?:null\b)/,/^(?:true\b)/,/^(?:false\b)/,/^(?:[0-9]+(\.[0-9]+)?\b)/,/^(?:[a-zA-Z_][a-zA-Z0-9_]*)/,/^(?:'[^\']*')/,/^(?:"[^\"]*")/,/^(?:\+)/,/^(?:-)/,/^(?:\*)/,/^(?:\/)/,/^(?:&&)/,/^(?:\|\|)/,/^(?:!=)/,/^(?:==)/,/^(?:<=)/,/^(?:<)/,/^(?:>=)/,/^(?:>)/,/^(?:!)/,/^(?:\?)/,/^(?::)/,/^(?:%)/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:\()/,/^(?:\))/,/^(?:,)/,/^(?:\.)/,/^(?:.)/,/^(?:$)/], +conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],"inclusive":true}} }); return lexer; })();