首页 > 编程知识 正文

javaparser,用vb编写简单的程序

时间:2023-05-06 08:06:03 阅读:114771 作者:3373

何谓parser? 简而言之,parser的工作是将代码片段转换为计算机可读数据结构的过程。 这个“计算机可读数据结构”更专业的说法是“抽象语法树”,简称AST。 AST是代码片段具体含义的抽象表示,不包含该代码的所有细节,如缩进和换行符。 因此,可以使用parser将其转换为AST,但不能使用AST恢复“原始”代码。 当然,可以恢复语义一致的代码,就像将ES6语法的js代码转换为ES5一样。

parser的结构通常由两部分组成:一个parser。

对应于词法分析器(lexer/scanner/tokenizer )语法的解释器(parser )在解释一个代码时,首先词法分析器将代码段转换为一个个短语流(token )

为了更清楚地理解parser的两个部分的工作步骤,举一个例子进行说明。

437734parser分析此类计算公式时,词法分析器首先依次扫描到“4”、“3”、“7”以生成空格字符。 此时,词法分析器将以前扫描的数字称为" NUM "的类型的短语(token ); 接着,词法分析器继续向下扫描,扫描到“”。 这对应于输出“PLUS”类型的短语(token )。 最后,扫描“7”、“3”和“4”以输出另一种类型的“编号”短语“令牌”。

解释器接收到词法分析器输出的短语流后,根据短语流的“num”、“‘plus”和“num”的排列顺序,将其分析为加法公式。

从以上例子可以看出,词法分析器按照一定的规则分析字符串,作为短语(token )输出,具体而言是连续的数字组合()、)、) 3、)、) 7、)、) 3、)、)4)表示数字的类型解释器也同样根据一定的规则分析短语的组合,输出对应的公式和句子。 这里,词法分析器适用的规则是词汇语法Lexical Grammar的定义,语法分析器适用的规则是表达式Expressions、语句语句Statements、声明Declarations、函数Functions等的定义。

ECMAScript标准看了这里可能会觉得不可思议,为什么parser说得很好,又跑到ECMAScript标准来了呢? 上述词汇语法(Lexical Grammar )、表达式(Expressions )、语句(Statements )、声明(Declarations )、函数(Functions )等都是在ECMAScript标准中定义的

词汇词法(Lexical Grammar ) ECMAScript词汇词法中,哪些字符表示空白(White Space ),哪些字符表示一行末尾(Line Terminators ),哪些字符组合表示注释) commenent

这里不要详细研究每个语法的定义,只要知道词法分析器(lexer )判读短语(token )的根据来源于此就可以了,为了在某种程度上理解,这里是上面例子中的数字字面量) numeric llex

在ECMAScript标准中,数字的字面量定义如下:

这个定义需要从上到下解读。

首先,规则定义数字字面量(Numeric Literal )为十进制字面量(Decimal Literal )、二进制整数字面量(Binary Integer Literal )、八进制整数字面量(Octal Integer Literal )

在我们的示例中,我们只关注十进制字面量,因此规则定义十进制字面量(Decimal Literal )可以是包含和不包含小数点的组合。 在此,只要关注不包含小数点的定义,即十进制整数字面量(Decimal Integer Literal )的任意指数部分) Expper )即可

最后,规则中定义的十进制整数字符的量由1到9之间的数字组成的非零数字Decimal Digits或十进制数字组组成,非零数字由1到9之间的数字组成

重新合并上述定义,可以得到所需数字字面量的定义规则。

非零数字(1至9 )十进制数字组(0至9 ) ) )。

请注意,这是简化版的数字字面定义,需要将上述规则的所有分支条件添加到完整版的需要中。

表达式Expressions,语句[statements]ecmascript标准第12 ̄13章包含表达式和语句的定义,在语法分析器parser中处理由词法分析器lexer处理生成的短语流token

同与关系:

首先,语句包含表达式,大部分语句是由关键字+表达式或语句组成,而表达式则是由字面量(Literal)、标识符(Identifier)、符号(Punctuators)等低一级的词组组成;

其次,表达式一般来讲会产生一个值,而语句不总有值。

理解第一点对于我们写语法解释器很重要,由于语句是由表达式组成的,而表达式是有词组组成的,词组是有词法解析器进行解析生成的,所以,在语法解释器中,将以表达式为切入点,由表达式解析再深入到语句解析中。

抽象语法树(AST)

了解一个parser的结构,以及parser解析语法所依赖的规则后,接下来,我们需要了解一下一个parser所生产出来的结果——抽象语法树。在文章的开头,我有简单的解释抽象语法树即是具体代码片段的抽象表达,那它具体是长什么样的呢?

function sum (a , b) { return a+b;}

以上的代码片段,AST树的描述如下(使用babylon7-7.0.0-beta.44,结果进行了简化):

{ "type": "Program", "body": [ { "type": "FunctionDeclaration", "id": { "type": "Identifier", "name": "sum" }, "params": [ { "type": "Identifier", "name": "a" }, { "type": "Identifier", "name": "b" } ], "body": { "type": "BlockStatement", "body": [ { "type": "ReturnStatement", "argument": { "type": "BinaryExpression", "left": { "type": "Identifier", "name": "a" }, "operator": "+", "right": { "type": "Identifier", "name": "b" } } } ] } } ]}

对该AST仔细观察一番,便会明白,AST其实即是我们在已经ECMAScript标准对代码进行解析后,将标识符(identifier)、声明(declaration)、表达式(expression)、语句(statement)等按代码表述的逻辑整理成为树状结构。就拿上面的例子来说,当语法解析器识别了一个二元表达式(Binary Expression),便将这个二元表达式所携带的信息——左值,右值,操作符按照固定的计算机可读的数据格式保存下来,即是我们看到的AST树了。

当然,AST也需要具备固定的格式,这样计算机才能依照该格式阅读AST并进行接下来的编译工作,当然,有一些AST也被用来转义(如babel)。关于AST定义的规则,我们可以参考babel的定义,这也是后面我们实现parser时,所参考的标准。

接下来

理解完以上相关的知识,我们便具备编写一个parser的先决条件了,那在下一章,我们将实际操作一番,编写一个简易版本的JavaScript语言parser。

《如何编写简单的parser(实践篇)》

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。