前语

在开发项目的进程傍边或多或少的分运用静态剖析东西来辅佐完毕一些类似语法检查、类型剖析这样的作业。把握必要的静态剖析才华能够提高项目开发的功率,减少不必要的初级差错。

常用静公务员考试态剖析东西

iOxcode怎样用S的开发进程中一般有以下的静态剖析东西能够运用:

Analyzer:Clang Static Analyzer是一款静态代码扫描东西,专门用于针对C,C++和Objective-C的程序进行剖析。现已被Xcode集成,能够直node.js装置教程接运用Xcode进行静态代码扫描剖析,也能够单独在指令行下运用并供给html格式的输出报吿和xml格式的效果文件便利集成到Jenkins上进行展现

Infnode.js装置步骤er:是Faceb女配每天都在为国争光ook开发的静态剖析东西。Infer 能够剖析 Objective-C, Java 或许 C 代码,陈述潜在的问题。

OCLint:是一个强健的静态代码剖析东西,它依据clang,能够用来前进代码质量,查找潜在的bu女配没有求生欲txtg,首要针对c,c++和Objnode.js装置教程ective-c的静态剖析,功用非常强健。

以上常用的三款静态剖析东西都有比较完好的功用完毕,内部完毕相对复杂,灵活性与自界说可扩展才华都没有自己完毕一个便利,能够依据clang运用C或许C++接口xcode怎样运行完毕静态剖析,这样完毕的学习与开Go发本钱也比较大。好有没有轻量一点的解决方案呢,答案xcode怎样用是必定的: 依据antlr的超轻量剖析东西。
接下来,本节将经过完毕一个对Objective-C的类进行剖析并打印出相关信息来阐明怎样快速建立一个超轻量、可控、javascript数据类型高集成的静态剖析东西。

建立轻量静态剖析东西

运用antlr4能够快速建立一javascript菜鸟教程个轻量的静态剖析东西,挑选自己适合的言语快公积金贷款速开发女配美炸天剖析事女配每天都在抱大腿务。

一、设备antlr4

进入到antlr官网: www.antlr.org/,以`macOS`体系…:

$ cd /usr/local/lnode.js装置ib
$ sudo cnode.js装置步骤url -O https://www.anXcodetlr.org/download/antlr-4.9.2-complete.javascript根底入门jar
$ export CLASSPATH=".:/usr/local/lib/antlr-4.9.2-complete.jar:$CLASSjavascriptPATH"
$ alias antlr4='java -jar /usr/local/lib/antlr-4.9.2-complete.jar'
$ alias grun='java org.antlr.v4.googlegui.TestRig'

设备完毕后,在终端输入

axcode病毒检测东西ntlrnode.js是什么4

检查是否有以下内容输入,检查是否设备成功
快速完成一个超轻量的静态剖析东西
现在antlrruntime现已支撑以下言语javascript根底入门

  • Java
  • C# (and an alternate C# target)
  • Python (2 and 3)
  • JavaScript
  • Go
  • C++
  • Swift
  • PHP
  • DART

你能够挑选一种你最了解或许说javascript数据类型其时最适合你的言语来开发静态剖析东西,本节实例将收集JavaScript言语依据Node.js开发一个用于剖析其时Objective-CiOS项目的中一切类完毕的协议。

二、公积金提取设备Node.js开发环境

进入到Node.js官网: nodejs.org/zh-cnode.js下载n/,下载女配美炸天一个…:

node --version

检查是否正确输出Node.js的版别。

三、建立静态剖析东西

创建Node.js剖析东西node.js面试题项目

javascript什么意思终端输入

npm init

初始公积金化一个Node.js项目,生成index.js进口文件,添加一个发动脚本指令,运用Visual Codxcode教程e翻开看上去是这样的,终究它看上去是这样的:
快速完成一个超轻量的静态剖析东西

npm run start

检查是否能正常作业。

设备JavaScriptantlr4作业时

npm install antlr4 --save

生成支撑JavsScript解析规矩

antlr这个地址供给了简直一切的言语规矩文件g4: gitjavascript数据类型hub.com/antlr/granode.js是什么mm…:
快速完成一个超轻量的静态剖析东西快速完成一个超轻量的静态剖析东西

ObjectiveCLexer:词法(Token)解析规矩文件
ObjectiveCParser:语法(AST)解析规矩文件

首要运用antlr编译词法规矩文件

antlrnode.js是前端仍是后端4 -Dlanguage=JavaScript -no-listener ObjectiveCLexer.g4

然后再编译语法规矩文件

antlr4 -Dlanguage=JavaScript -no-listener ObjectiveCParser.JavaScriptg4

-no-listenode.js面试题ner:表明不生成listener办法的相关代码支撑。
antjavascript面试题lr有两种遍历办法: visitorlistener。从字面的意思就能够看出visitor是访问办法,即开发者主动从AST顶层开端一层一层的访问遍历AST。而listener则为监听办法,即由作业时从顶层AST开端层层遍历访问,女配明天见当访问到一个节点时回调开发者。visitor办法主动生成的xxxxVisitor.js需求完善一些办法节点的办法,以检查语法google中的规矩。而本节实例是访问AST并获取节点上某些要害的信息,运用Parser供给的办法即可满足。
经过以上的antlr指令编译生成如下的规矩解析文件:

快速完成一个超轻量的静态剖析东西

编码

index.js中导入相关的JavsS公积金贷款cript文件与库:

import antlr4 from "antlr4";
import Objenode.js的特点ctiveCLexer from "女配每天都在抱大腿./ObjectiveCLexer.js";
import ObjectiveCParser from "./ObjectiveCParser.js";Go
import fs from "fs";

因为这儿支撑ES6import语法,所以package.json中需求声明一下:
快速完成一个超轻量的静态剖析东西

预备好一个测试运用的Objective-C的文件,本节运用的是一个非常简略的头文件,仅用于阐明实例的运用:
快速完成一个超轻量的静态剖析东西

读取Objecjavascript是干什么的tive-C文件:

const input = fs.readFileSync("./FSBaseViewController.h", {
encoding: "utf-8",
}javascript面试题);

运用antlr生成的作业时语法解析文件,将读取到的Objective-C解析成AST

const chars = new antlr4.InputStream(input);
const lexer = new ObjectiveCLexer(chars);
const tokens女配每天都在为国争光 = new antlr4.CommonTokenStream(lexer);
const parser = new ObjectiveCParser(tokens);
parser.buildParseTrees = true;
const trexcode怎样编写c言语e = parser.translationUnit();

这儿的ObjectiveCParser是依据ObjectiveCPa宫颈癌疫苗rser.g4生成的规矩解析文件,从ObjectiveCParser.g4中能够到

快速完成一个超轻量的静态剖析东西

ObjectiveCParser.g4声明的顶层节点是translationUint。

ObjectiveCParser.g4中的声明能够看出, translationUnit中只声清楚两个子节点topLevelDeclaration*node.js面试题明顶层节点是一个或许多个,与EOF完毕节点。这是因为在同一个源文件中能够声明多个Objective-C的Class。,经过如下代码即可取到对应的顶层节点,因为本节明晰只要一工商银行个顶层极点,所以代码如下:

consnode.js 教程t topLevelDeclarationNodes = tree.topLevelDec女配每天都在抱大腿我要成仙laration();
if (topLevelDeclarationNodes.length == 0) return;
const topLevelDeclarationNode = to女配美炸天pLevelDeclarationNodes宫颈癌疫苗[0];
if (!topLevelDeclarationNjavascript面试题ode) return;

或许

coJavaScriptnst topLevelDec女配每天都在为国争光laxcode是什么软件rationNode = tree.topLevelDeclaration(0);
if(!topLevelDeclarationNode) return;

获取到topLevelDeclarationNode之后,再检查ObjectiveCParser.g4中的声明如下:

快速完成一个超轻量的静态剖析东西

node.js 教程个节点声清楚很多种node.js是前端仍是后端节点类型,在本节中Node.js关怀的是classInterfJavaScriptaxcode怎样编写c言语ce节点。如果你还想进一步要判断协议中的办法是否完毕,能够进一步探查clasImplementation节点。

const classInterfaceNode = topLevelDeclarationN公积金贷款ode.classInterface();
if (!classInterface公积金Node) return;javascript是干什么的

ObjectiveCParser.g4classInterface节点xcode怎样编写c言语的解析规矩界说如下:

快速完成一个超轻量的静态剖析东西

其间classxcode教程Interface包括了className,或许包括一个protonode.js装置步骤colList它是一个数组,即这个类声明完毕了的Protocol

获取class name,ObjectiveCParser.g4中可将节点推导成一个TJavaScripterminalNode节点,节点包括一个symbol即节点的字xcode是什么软件符串字面量。

 /// GenericTypeSpecifierContext
const classNameNode = classInterfaceNode.cljavascript怎样读assName;女配每天都在为国争光
if (!cljavascript面试题assNameNode) return;
const c女配每天都在抱大腿我要成仙lassNameIdentifierNode = clajavascript什么意思ssNameNode.identifier();
console.log(`class interface name: ${_javascript根底入门getSymbolText(classN公积金amejavascript什么意思IdentifierNode)}`);

其间_getSynbolText函数界说如下:

funcxcode怎样编写c言语tion _getSymbolText(identifierNode) {
if (!identifierNode) return null;
if (!(identifierjavascript:void(0)Node instanceof ObjectiveCParser.Identi女配明天见fierContext)) return null;
if (identifierNode && identifierNode.children && identifierNode.children instanceof Array && identifierNode.childr女配每天都在为国争光en.length > 0) {
const term女配没有求生欲藤萝为枝inalNodeImpl = identifierNode.children[0];xcode怎样编写c言语
if (terminalNodeImpl) {
const symbol = terminalNodeImXcodepl.symbol;
if (symbol) {
return sxcode怎样运行c++程序ymbol.text;
}
}
}
return null;
}

获取完毕的协议列表:

const protocolList =javascript:void(0) clas女配没有求生欲txtsInterfa公积金ceNode.protocolList();
if (protocolList &amGop;& protocolList insjavascript是干什么的tanceof ObjectiveNode.jsCParser.ProtocolListContext) {
const protocolListNa公积金贷款mes = protocolList.children.map((protocol) => {
const identifier = pr女配没有求生欲txtotocol.女配每天都在为国争光identifier();
const protxcode怎样运行ocolName = _getSymbolTextjavascript高级程序设计(identif女配没有求生欲藤萝为枝ier);
return {
protojavascript什么意思colName,
};
})xcode怎样运行;
console.log(protocolListNames);
}

终究作业效果如下:
快速完成一个超轻量的静态剖析东西

到这儿一个依据antlr4的快速轻量静态剖析东西雏形就完毕了,多尝javascript试练习一下即可在1女配没有求生欲txt0分鈡建立一个能快速集成到你的工程中的静态剖析东西,这个集成是轻量的、可控的。

更多内容请注重微信大众号<<程序猿搬xcode下载装置砖>>