当前位置: 首页 > news >正文

【Vue】集成Antlr4

1.下载.g4文件

下载地址:https://download.csdn.net/download/qq_42454367/90396095

2.安装Antlr

(1)使用以下命令安装依赖

pnpm install antlr4ng
pnpm install --save-dev antlr4ng-cli

(2)在package.json文件中配置

"scripts": {
        ...
                "antlr4ng": "antlr4ng -Dlanguage=TypeScript -o src/assets/antlr/ -visitor -listener -Xexact-output-dir src/assets/antlr/Java.g4"
    },

其中,-Dlanguage为要生成的文件类型 ,**-o src/assets/antlr/**为生成的目录,src/assets/antlr/Java.g4为.g4文件的地址。
3)点击调试,选择antlr4ng运行。
在这里插入图片描

运行结束,将在目录生成对应文件。
在这里插入图片描述
(4)再在对应页面将其引入调用即可

import { CharStream, CommonTokenStream } from "antlr4ng";
import { JavaLexer } from "@/assets/antlr/JavaLexer";
import { JavaParser } from "@/assets/antlr/JavaParser";

在这里插入图片描述

3.出现的问题

(1)The requested module ‘/node_modules/.vite/deps/antlr4ng.js?v=aaef2d65’ does not provide an export named
在这里插入图片描述
在这里插入图片描述
解决方法:在对应位置加上type即可
在这里插入图片描述

4.示例代码

import * as antlr4ng from 'antlr4ng'
import { JavaLexer } from '@/assets/antlr/JavaLexer'
import {
  CompilationUnitContext,
  ImportDeclarationContext,
  JavaParser,
  PackageDeclarationContext,
  TypeDeclarationContext,
} from '@/assets/antlr/JavaParser'
import { JavaListener } from '@/assets/antlr/JavaListener'
import { JavaVisitor } from '@/assets/antlr/JavaVisitor'

/**
 * 加载解析器
 *
 * 该函数使用ANTLR解析器对Java代码进行解析它首先将代码字符串转换为字符流,
 * 然后通过JavaLexer生成词法分析结果,最后使用JavaParser生成语法树
 *
 * @param code 待解析的Java代码字符串
 * @returns 返回解析生成的语法树
 */
export const loadParser = (code: string) => {
  let charStream = antlr4ng.CharStream.fromString(code)
  let lexer = new JavaLexer(charStream)
  return new JavaParser(new antlr4ng.CommonTokenStream(lexer)).compilationUnit()
}

/**
 * 获取包名
 *
 * 此函数使用解析器构建代码的抽象语法树,然后遍历该树以找到并提取包声明
 * 如果找到包声明,它会进一步解析以构造完整的包名字符串
 *
 * @param code 包含Java代码的字符串
 * @returns 提取到的包名字符串,如果没有找到包声明,则返回空字符串
 */
export const getPackageName = (code: string) => {
  let packageName = ''
  // 获取包名的限定名称节点
  let qualifiedName = loadParser(code).packageDeclaration()?.qualifiedName()
  if (qualifiedName != null) {
    // 遍历限定名称中的标识符
    for (let i = 0; i < qualifiedName?.Identifier().length; i++) {
      if (i > 0) {
        packageName += '.'
      }
      packageName += qualifiedName.Identifier()[i]?.getText() || ''
    }
  }
  return packageName
}

/**
 * 获取依赖信息
 *
 * 该函数通过解析给定的代码字符串,提取出其中的依赖项
 * 主要用于代码分析,了解一个代码片段依赖于哪些外部模块或组件
 *
 * @param code 需要解析的代码字符串
 * @returns 返回提取出的依赖项数组
 */
export const getDependency = (code: string) => {
  return extractImports(loadParser(code), [])
}

/**
 * 递归解析语法树
 */
let extractImports = (tree: any, val: string[]) => {
  if (tree instanceof ImportDeclarationContext) {
    // 提取import语句
    val.push(tree.getText().replace(/^\s*import\s*/, ''))
  }
  // 递归遍历子节点
  for (let i = 0; i < tree.getChildCount(); i++) {
    extractImports(tree.getChild(i), val)
  }
  return val
}

相关文章:

  • k8s-对接NFS存储
  • java:用Guava的TypeToken优雅处理通配符类型(WildcardType): ? extends Number
  • JSON类型理解(前后端交互/内存对数据操作)
  • 【论文技巧】Mermaid VSCode插件制作流程图保存方法
  • POI优化Excel录入
  • LangFlow和LangChain有什么区别
  • 大数据SQL调优专题——Flink执行原理
  • Web3 通识
  • 解锁外观模式:Java 编程中的优雅架构之道
  • TortoiseSVN\bin下的没有svn.exe的解决问题
  • Linux的基础指令和环境部署,项目部署实战(下)
  • pyinstaller打包报错:INTEL MKL ERROR: 找不到指定的模块。 mkl_intel_thread.dll.
  • linux 安装启动zookeeper全过程及遇到的坑
  • C++ 模拟真人鼠标轨迹算法 - 防止游戏检测
  • 启元世界(Inspir.ai)技术浅析(七):AI Beings 平台
  • Nginx下proxy_redirect的三种配置方式
  • 【系列教程】Python第四课:条件判断 | 让程序学会思考的秘密
  • UE求职Demo开发日志#33、34 优化#2 删没用的场景和优化UI
  • 浅谈模组-相机鬼像
  • blender笔记2
  • 前瞻|中俄元首今年将首次面对面会晤,专家:国际变局中构建更坚韧的合作架构
  • 越老越妖的库里,成了火箭季后赛里一晃十年的噩梦
  • 贵州游船侧翻248名消防员已在搜救
  • 甘肃公布校园食品安全专项整治案例,有食堂涉腐败变质食物
  • 今年4月上海一二手房成交面积同比增21%,二手房成交2.07万套
  • 美乌矿产协议签署被曝“临门一脚”时生变,美方提附加条件