我目前正在阅读Javascript: The Good Parts,但我无法理解他们的“语法”图表。
第一个是空白
我不太确定如何阅读它,也许一些代码会帮助我理解?
感谢各位高手的帮助。
我目前正在阅读Javascript: The Good Parts,但我无法理解他们的“语法”图表。
第一个是空白
我不太确定如何阅读它,也许一些代码会帮助我理解?
感谢各位高手的帮助。
从最左边开始,||
然后继续向右。向下的第一条(紧挨着您的起点)无法跟随,因为曲线不是从左侧(您行进的方向)开始的。如果您查看它的来源,应该很容易看出它代表一个while
环形:
while (!EOF) {} // While there's still text to parse
可以跟随第二行,因为曲线源自左侧(跟随您的当前目录。)此行表示此 if-else 语句:
if (char == '/') {} // Forward slash
else if (char == '\n') {} // Line end
else if (char == '\t') {} // Tab
else if (char == ' ') {} // Space
空格、制表符和结束行都结束函数,return
或者continue
立即结束。但是,如果字符是正斜杠,则需要检查它是单行(//
)还是多行(/* */
):
*char++; // Move to next character
if (char == '*') {} // Multi line
else if (char == '/') {} // Single line
如果它是单行,它会一直读取到行尾并继续。如果它是多行,它会以类似的方式读取,直到找到“*”后跟“/”,然后继续。
The left side double bar ("||") can be viewed as the "input" of a function and the right double bar as the "output". So, in this case, a character or line is the input, and the paths between the double bars are the tests. If the character/line is considered "white space" by any of the tests, the output of the function will be "true", otherwise it will be "false."
In particular, let's say you follow the fourth path. On this path you will first encounter a "/", subsequently followed by another "/", followed by any other character until the EOL character. In this case, if the line of code is "// an example", then the output will be true.
把它想象成你是解析器或语言,你需要一套规则来理解输入的字符流。
通过思考解析器是如何工作的,您可以准确地理解 JavaScript 语言标记的组成部分。
您参考的语法图被广泛用于记录 Pascal 语法。它基本上是如何解析源代码的流程图。图表的每个“块”,在您的示例中,“空白”,就像一个函数调用。从技术上讲,我们正在谈论递归下降解析器。
所以我的想法是:
解析器从输入流中获取一个字符。所以我们去“尝试”空白函数,如果该字符是空格、制表符、行尾或“/”字符,我们进入下一步,否则我们以“未找到”返回值退出。
如果它是一个'/',那么我们得到下一个字符。如果它是另一个'/',那么我们读取字符直到我们得到一个行结束,然后以'found'返回值退出。
如果下一个字符是 ' ',那么我们会读取任何不是 '/' 或 ' ' 的内容。ETC ...
基本上流程是从左到右的,但是当一条线循环回到左边时,我们有一个重复。这些图表的巧妙之处在于,一旦你掌握了它的窍门,就很容易快速编写语法正确的代码。并且您可以按照“流程图”轻松编写递归下降解析器。
(参考这个答案)
要学习如何阅读铁路图,您需要了解图表在这三种情况下的区别:
零个或多个,零个或一个,一个或多个。
要了解它们的区别(如下图所示),重点是“您从左边缘开始,沿着轨道到右边缘”。所以想象你是火车,你只是右转,不能左转。
上图由http://bottlecaps.de/rr/创建 在“编辑语法”选项卡中,输入以下语法:
zeroormore ::= element*
zeroorone ::= element?
oneormore ::= element+