我是一名计算机科学专业的大学生。我的很多同学并没有真正做过太多编程。他们完成了课堂作业,但说实话那些问题并不能真正教你如何编程。
我曾经有几个同学问我如何解析某些内容,但我从来不确定该如何向他们解释。是一行一行地寻找子字符串最好呢,还是给他们更复杂的讲解,例如使用正确的词法分析等创建令牌,使用BNF等所有其他东西?当我试图解释时,他们从未完全理解。
在不让他们困惑或泄气的情况下,最好的方法是什么。
我是一名计算机科学专业的大学生。我的很多同学并没有真正做过太多编程。他们完成了课堂作业,但说实话那些问题并不能真正教你如何编程。
我曾经有几个同学问我如何解析某些内容,但我从来不确定该如何向他们解释。是一行一行地寻找子字符串最好呢,还是给他们更复杂的讲解,例如使用正确的词法分析等创建令牌,使用BNF等所有其他东西?当我试图解释时,他们从未完全理解。
在不让他们困惑或泄气的情况下,最好的方法是什么。
我认为解析是将某种数据转换为另一种数据的过程。
在实践中,这对我来说几乎总是将字符串或二进制数据转换为程序内的数据结构。
例如,将
":Nick!User@Host PRIVMSG #channel :Hello!"
C语言中的into。
struct irc_line {
char *nick;
char *user;
char *host;
char *command;
char **arguments;
char *message;
} sample = { "Nick", "User", "Host", "PRIVMSG", { "#channel" }, "Hello!" }
sample.message
分配给字符“Hello!”。这是将名称分配给意义的任务的必要前提,但完全独立于分配名称的任务 - 例如,sample.message
表示什么或者做什么?正如Carlos所指出的那样,那就变成了语义分析。 - Daniel Pryden语法分析是指对由一系列标记组成的文本进行分析,以确定其与给定(或多或少)正式的语法结构相匹配。
解析器会根据标记构建数据结构。然后编译器、解释器或翻译器可以使用这个数据结构来创建可执行程序或库。
(来源: wikimedia.org)
如果我给你一句英文句子,并要求你将该句子分解为其各部分的词性(名词、动词等),那么你就在进行解析。
这是我能想到的最简单的解析概述。
话虽如此,解析是一个非常复杂的计算问题。你需要从简单的例子开始,逐步提高难度。
在计算机科学中,解析是指分析文本以确定它是否属于特定的语言(即是否符合该语言的语法)的过程。这是句法分析过程的非正式名称。
例如,假设语言a^n b^n
(表示相同数量的字符A后跟相同数量的字符B)。 该语言的解析器将接受AABB
输入并拒绝AAAB
输入。这就是解析器的作用。
此外,在此过程中,可以创建数据结构以进行进一步处理。在我的前面的例子中,它可以将AA
和BB
分别存储在两个单独的堆栈中。
任何之后发生的事情,比如赋予AA
或BB
意义,或者将其转换为其他内容,都不是解析。赋予令牌序列输入部分含义称为语义分析。
我认为理解解析概念的最好方法是从简单的概念开始。在语言处理学科中最简单的概念是有限自动机。它是用于解析正则语言(如正则表达式)的形式化工具。
它非常简单,你有一个输入、一组状态和一组转换。考虑以下由字母表 { A, B }
构建的语言,L = { w | w以'AA'或'BB'作为子字符串开始 }
。下面的自动机表示该语言的一个可能的解析器,其所有有效单词都以'AA'或'BB'开头。
A-->(q1)--A-->(qf)
/
(q0)
\
B-->(q2)--B-->(qf)
(q0)
开始,然后从输入中读取一个符号,如果它是A
,那么你就移动到(q1)
状态,否则(它是B
,请记住字母表只有A
和B
)你就移动到(q2)
状态,以此类推。如果你到达了(qf)
状态,那么输入就被接受了。让他们尝试编写一个能够评估任意简单算术表达式的程序。这是一个简单易懂的问题,但随着进一步深入研究,很多基本的解析开始变得有意义。
在语言学中,将语言分成可以分析的小组件。例如,解析这个句子就需要将其分成单词和短语,并确定每个组件的类型(例如动词、形容词或名词)。
解析是许多计算机科学学科中非常重要的一部分。例如,编译器必须解析源代码才能将其转换为目标代码。同样,任何处理复杂命令的应用程序都必须能够解析命令。这包括几乎所有终端用户应用程序。
解析通常分为词法分析和语义解析两部分。词法分析集中于基于标点符号和其他关键字将字符串分成组件,称为标记。然后语义解析试图确定字符串的含义。