Fix formatting of escaping table.
The visual formatting of this table got corrupted when we
clang-formatted everything. Turn clang formatting off for this table to
preserve the structure.
Clarify some comments in the parser.
Change-Id: I93b00ff12789eed97f61923c704a5ecaeea4de0f
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/4640
Reviewed-by: Brett Wilson <brettw@google.com>
Reviewed-by: Thomas Anderson <thomasanderson@chromium.org>
Commit-Queue: Brett Wilson <brettw@google.com>
diff --git a/tools/gn/escape.cc b/tools/gn/escape.cc
index f2b1324..aa6b967 100644
--- a/tools/gn/escape.cc
+++ b/tools/gn/escape.cc
@@ -22,22 +22,24 @@
#endif
// A "1" in this lookup table means that char is valid in the Posix shell.
+// clang-format off
const char kShellValid[0x80] = {
- // 00-1f: all are invalid
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0,
- // ' ' ! " # $ % & ' ( ) * + , - . /
+// 00-1f: all are invalid
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+// ' ' ! " # $ % & ' ( ) * + , - . /
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
- // 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+// 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0,
- // @ A B C D E F G H I J K L M N O
+// @ A B C D E F G H I J K L M N O
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- // P Q R S T U V W X Y Z [ \ ] ^ _
+// P Q R S T U V W X Y Z [ \ ] ^ _
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1,
- // ` a b c d e f g h i j k l m n o
+// ` a b c d e f g h i j k l m n o
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- // p q r s t u v w x y z { | } ~
+// p q r s t u v w x y z { | } ~
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0};
+// clang-format on
// Uses the stack if the space needed is small and the heap otherwise.
class StackOrHeapBuffer {
diff --git a/tools/gn/parser.cc b/tools/gn/parser.cc
index e10ed41..0065afd 100644
--- a/tools/gn/parser.cc
+++ b/tools/gn/parser.cc
@@ -221,6 +221,12 @@
always unequal by definition.
)*";
+// Precedence constants.
+//
+// Currently all operators are left-associative so this list is sequential. To
+// implement a right-assocative operators in a Pratt parser we would leave gaps
+// in between the constants, and right-associative operators get a precedence
+// of "<left-associated-precedence> - 1".
enum Precedence {
PRECEDENCE_ASSIGNMENT = 1, // Lowest precedence.
PRECEDENCE_OR = 2,
@@ -241,9 +247,8 @@
// seen as either a prefix or infix operator, and if it's infix, what its
// precedence is.
//
-// Refs:
-// - http://javascript.crockford.com/tdop/tdop.html
-// -
+// References:
+// http://javascript.crockford.com/tdop/tdop.html
// http://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/
// Indexed by Token::Type.
diff --git a/tools/gn/parser.h b/tools/gn/parser.h
index 5ecbd9d..a537170 100644
--- a/tools/gn/parser.h
+++ b/tools/gn/parser.h
@@ -144,6 +144,8 @@
struct ParserHelper {
PrefixFunc prefix;
InfixFunc infix;
+
+ // Used only for infix operators.
int precedence;
};