什么是一个新的程序员会理解的parsing?
我是一名获得计算机科学学位的大学生。 我的很多同学真的没有做很多的编程。 他们已经完成了课堂作业,但是说实话,这些问题并没有真正教会你如何编程。
我还有其他几个学生问我如何parsing问题,而我也不太清楚如何向他们解释。 最好是开始一行一行地寻找子串,或者只是给他们更复杂的关于使用适当的词法分析等来创build令牌,使用BNF和所有其他的东西的讲座? 当我试图解释它们的时候,他们从来都不太明白。
什么是最好的方法来解释这一点,而不会混淆它们或阻止他们实际尝试。
我将解释解释为将某种数据转换为另一种数据的过程。
在实践中,对于我来说,这几乎总是将string或二进制数据转换为我的程序中的数据结构。
例如,转动
":Nick!User@Host PRIVMSG #channel :Hello!"
(C)
struct irc_line { char *nick; char *user; char *host; char *command; char **arguments; char *message; } sample = { "Nick", "User", "Host", "PRIVMSG", { "#channel" }, "Hello!" }
parsing是分析由一系列令牌组成的文本以确定其关于给定(或多或less)forms语法的语法结构的过程。
parsing器然后build立一个基于令牌的数据结构。 这个数据结构可以被编译器,解释器或翻译器用来创build一个可执行的程序或库。
替代文字http://upload.wikimedia.org/wikipedia/en/a/a9/Parser_Flow.gif
如果我给了你一个英文句子,并要求你把这个句子分解成它的词性(名词,动词等),你就可以parsing句子。
这是解释我能想到的最简单的解释。
这就是说,parsing是一个不平凡的计算问题。 你必须从简单的例子开始,一路走到更复杂的地步。
什么是parsing?
在计算机科学中,parsing是分析文本以确定其是否属于特定语言(即对于该语言的语法在语法上有效 )的过程。 这是句法分析过程的非正式名称。
例如,假设语言a^nb^n
(表示相同数量的字符A,后跟相同数量的字符B)。 该语言的parsing器将接受AABB
input并拒绝AAAB
input。 这是一个parsing器所做的。
另外,在这个过程中,可以创build一个数据结构进行进一步的处理。 在我之前的例子中,它可以将AA
和BB
存储在两个独立的堆栈中。
任何发生在它后面的事情,比如赋予AA
或BB
意义,或者改变其他东西,都不是parsing。 赋予令牌的input序列部分的含义称为语义分析 。
什么是不parsing?
- parsing不是将一件事物转化为另一件事物。 将A转换成B,本质上是编译器的function。 编译需要几个步骤,parsing只是其中的一个。
- parsing不是从文本中提取的意思。 从文本中提取意义,是语义分析 ,这是编译过程的一个步骤。
了解它最简单的方法是什么?
我认为理解分析概念的最好方法是从简单的概念开始。 语言处理主体中最简单的是有穷自动机。 这是parsing常规语言(如正则expression式)的一种forms。
这很简单,你有一个input,一组状态和一组转换。 考虑在字母表{ A, B }
build立的以下语言, L = { w | w starts with 'AA' or 'BB' as substring }
L = { w | w starts with 'AA' or 'BB' as substring }
。 下面的自动机表示该语言的可能parsing器,其所有有效单词以“AA”或“BB”开头。
A-->(q1)--A-->(qf) / (q0) \ B-->(q2)--B-->(qf)
这是一个非常简单的语言parsing器。 你从(q0)
开始,初始状态,然后你从input中读取一个符号,如果是A
那么你就移动到(q1)
状态,否则(这是一个B
,记住记住字母表只是A
和B
)你移到(q2)
状态等等。 如果达到(qf)
状态,则input被接受。
因为它是可视的,所以只需要一支铅笔和一张纸来解释一个parsing器对任何人,包括一个孩子。 我认为简单性是使自动机成为教授语言处理概念(如parsing)的最合适的方式。
最后,作为一名计算机科学专业的学生,您将深入研究理论计算机科学课程中的这些概念,例如forms语言和计算理论。
让他们尝试编写一个可以评估任意简单算术expression式的程序。 这是一个很容易理解的问题,但是当你开始深入了解的时候,很多基本的parsing开始变得有意义。
在语言学中,把语言分成可以分析的小部分。 例如,parsing这个句子将涉及到将它分成单词和短语,并确定每个成分的types(例如,动词,形容词或名词)。
parsing是许多计算机科学学科非常重要的一部分。 例如,编译器必须parsing源代码才能将其转换为目标代码。 同样,处理复杂命令的任何应用程序都必须能够parsing命令。 这几乎包括所有的最终用户应用程序。
parsing通常分为词法分析和语义parsing。 词汇分析着重于将string划分为基于标点符号和其他键的称为令牌的组件。 然后语义分析试图确定string的含义。
parsing是关于以一种格式读取数据,以便您可以使用它来满足您的需求。
我想你需要教他们这样想。 所以,这是我能想到解释一个新的这个概念的人最简单的方法。
一般来说,我们试图一次一行地parsing数据,因为一般来说人类更容易思考,分裂和征服,也更容易编码。
我们把领域称为每一个最小的不可变数据。 名称是字段,年龄是另一个字段,而姓氏是另一个字段。 例如。
一行,我们可以有各种各样的领域。 为了区分它们,我们可以用分隔符或每个字段的最大长度来分隔字段。
例如:通过逗号分隔字段
保罗,20,琼斯
或者按空格(姓名最多可以有20个字母,年龄最多3个数字,琼斯最多20个字母)
保罗020琼斯
前面任何一组字段都称为logging。
要隔开一个分隔的字段logging,我们需要分隔logging。 一个点就足够了(尽pipe你知道你可以应用CR / LF)。
列表可能是:
迈克尔,39,Jordan.Shaquille,40,O'neal.Lebron,24,詹姆斯。
或与CR / LF
迈克尔,39,约旦
沙奎尔,40,奥尼尔
勒布朗,24,詹姆斯
你可以说他们列出他们喜欢的10个nba(或nlf)球员。 然后,他们应该按照格式input。 然后制作一个程序来parsing它并显示每条logging。 一个组可以列表以逗号分隔的格式和一个程序来parsing一个固定大小的格式的列表,反之亦然。
对我来说,parsing是将某些东西分解成有意义的部分…使用一个可定义的或预定义的已知的,通用的部分“定义”。
对于编程语言,会有关键字部分,可用的标点符号…
南瓜派可能是像地壳,填充和浇头。
对于书面语言,可能是一个单词,一个句子,一个动词是什么…
对于口语来说,它可能是音调,音量,情绪,含义,情感,语境
语法分析(以及常识)会告诉你的parsing是一个南瓜还是一种编程语言。 它有shell吗? 也许是南瓜布丁或口语!
关于parsing东西需要注意的一件事情是,通常有很多方法可以将东西分解成几部分。
例如,你可以把南瓜馅饼从中心切到边缘,或者从底部切到顶部,或者用勺子把馅饼馅或者用大锤或者吃掉。
而你如何parsing事情将决定如果做这些部分将是容易或困难的。
在“计算机语言”的世界里,有很多常见的parsing文本源代码的方法。 这些常用方法(algorithm)有标题或名称。 在因特网上search常见的方法/名称来parsing语言。 维基百科可以在这方面提供帮助。
简单的解释:parsing是通过遵循一组规则(例如使用分隔符)将数据块分割成小块(令牌),以便这些数据可以一块一块地进行处理(pipe理,分析,解释,传输,ets) 。
示例:许多应用程序(如Spreadsheet程序)使用CSV(逗号分隔值)文件格式导入和导出数据。 CSV格式使得应用程序可以在特殊分析器的帮助下处理这些数据。 Web浏览器为HTML和CSS文件提供了特殊的parsing器。 存在JSONparsing器。 所有特殊的文件格式都必须有专门为它们devise的parsing器。