我目前正在阅读 JavaScript:The Good Parts,我在理解它们的“语法”图方面遇到了麻烦。第一个是空白
的数据我不太清楚如何阅读它,也许一些代码可以帮助我理解?谢谢你的帮助在先进的家伙。
polhcujo1#
从最左边的||开始,然后继续向右。第一个向下的条(紧挨着你的起点)不能跟随,因为曲线不是从左边(你正在行进的方向)开始的。如果你看它来自哪里,应该很容易告诉它代表一个while循环:
||
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。但是,如果字符是正斜杠,则需要检查它是单行(//)还是多行(/* */):
return
continue
//
/* */
*char++; // Move to next character if (char == '*') {} // Multi line else if (char == '/') {} // Single line
型如果是单行,它会一直读到行尾并继续;如果是多行,它会以类似的方式读到'*'后跟'/',然后继续。
bvuwiixz2#
左侧双杠(“||“)可以被视为函数的“输入”,而右边的双条则被视为“输出”。因此,在这种情况下,字符或行是输入,双条之间的路径是测试。如果字符/行被任何测试认为是“白色空格”,则函数的输出将为“true”,否则将为“false”。特别是,假设你沿着第四条路径走。在这条路径上,你会首先遇到一个“/",随后是另一个“/",然后是任何其他字符,直到EOL字符。在这种情况下,如果代码行是“// an example”,那么输出将为true。
cfh9epnr3#
想象一下,如果你是解析器或语言,你需要一组规则来理解输入的字符流。通过思考解析器是如何工作的,您可以准确地理解构成JavaScript语言的标记的是什么。
yvfmudvl4#
你提到的语法图被广泛用于记录Pascal语法。它基本上是如何解析源代码的流程图。图表的每个“块”,在你的例子中,“空白”,就像一个函数调用。从技术上讲,我们谈论的是递归下降解析器。所以我的想法是:解析器从输入流中获取一个字符。所以我们去“尝试”空白函数,如果该字符是空格,制表符,行尾或'/'字符,我们进入下一步,如果不是,我们退出并返回'not found'值。如果它是一个'/',那么我们得到下一个字符。如果它是另一个'/',那么我们读字符,直到我们得到一个行结束,然后退出与'发现'返回值。如果下一个字符是一个'*',那么我们会读取任何不是'/'或''的字符。基本上流程是从左到右的,但是当一行循环回到左边时,我们有一个重复。这些图的巧妙之处在于,一旦你掌握了它的窍门,就很容易快速地写出语法正确的代码。而且你可以很容易地按照“流程图”编写递归下降解析器。
pnwntuvh5#
(参见this answer)要学习如何阅读铁路图,你需要了解这三种情况下的图表的区别:
零或多个,零或一个,一个或多个。
要理解它们的区别(如下图所示),重点是 “你从左边开始,沿着轨道到右边。" 所以想象你是火车,你只是右转,不能左转。
的数据在“编辑语法”选项卡中,输入以下语法:
zeroormore ::= element* zeroorone ::= element? oneormore ::= element+
字符串
5条答案
按热度按时间polhcujo1#
从最左边的
||
开始,然后继续向右。第一个向下的条(紧挨着你的起点)不能跟随,因为曲线不是从左边(你正在行进的方向)开始的。如果你看它来自哪里,应该很容易告诉它代表一个while
循环:字符串
第二行可以跟随,因为曲线从左边开始(跟随您的当前目录)。这一行表示if-else语句:
型
空格、制表符和结束行都将立即结束函数,并且是
return
或continue
。但是,如果字符是正斜杠,则需要检查它是单行(//
)还是多行(/* */
):型
如果是单行,它会一直读到行尾并继续;如果是多行,它会以类似的方式读到'*'后跟'/',然后继续。
bvuwiixz2#
左侧双杠(“||“)可以被视为函数的“输入”,而右边的双条则被视为“输出”。因此,在这种情况下,字符或行是输入,双条之间的路径是测试。如果字符/行被任何测试认为是“白色空格”,则函数的输出将为“true”,否则将为“false”。
特别是,假设你沿着第四条路径走。在这条路径上,你会首先遇到一个“/",随后是另一个“/",然后是任何其他字符,直到EOL字符。在这种情况下,如果代码行是“// an example”,那么输出将为true。
cfh9epnr3#
想象一下,如果你是解析器或语言,你需要一组规则来理解输入的字符流。
通过思考解析器是如何工作的,您可以准确地理解构成JavaScript语言的标记的是什么。
yvfmudvl4#
你提到的语法图被广泛用于记录Pascal语法。它基本上是如何解析源代码的流程图。图表的每个“块”,在你的例子中,“空白”,就像一个函数调用。从技术上讲,我们谈论的是递归下降解析器。
所以我的想法是:
解析器从输入流中获取一个字符。所以我们去“尝试”空白函数,如果该字符是空格,制表符,行尾或'/'字符,我们进入下一步,如果不是,我们退出并返回'not found'值。
如果它是一个'/',那么我们得到下一个字符。如果它是另一个'/',那么我们读字符,直到我们得到一个行结束,然后退出与'发现'返回值。
如果下一个字符是一个'*',那么我们会读取任何不是'/'或''的字符。
基本上流程是从左到右的,但是当一行循环回到左边时,我们有一个重复。这些图的巧妙之处在于,一旦你掌握了它的窍门,就很容易快速地写出语法正确的代码。而且你可以很容易地按照“流程图”编写递归下降解析器。
pnwntuvh5#
(参见this answer)
要学习如何阅读铁路图,你需要了解这三种情况下的图表的区别:
零或多个,零或一个,一个或多个。
要理解它们的区别(如下图所示),重点是 “你从左边开始,沿着轨道到右边。" 所以想象你是火车,你只是右转,不能左转。
的数据
在“编辑语法”选项卡中,输入以下语法:
字符串