使用ANTLR4解析Yaml,JSON和Latex

文章目錄

    • ANTLR4基本使用
      • **1. 安裝 Java 運行時(必需)**
      • **2. 安裝 ANTLR4 命令行工具**
        • **方法一:通過包管理器(推薦)**
          • **macOS/Linux (Homebrew)**
          • **Windows (Chocolatey)**
        • **方法二:手動安裝(通用)**
      • **3. 驗證安裝**
      • **4. 配置環境變量(可選)**
        • **macOS/Linux**
        • **Windows**
      • **5. 使用示例**
        • **(1) 生成解析器**
        • **(2) 測試語法樹**
      • **6. 開發工具集成**
        • **Visual Studio Code**
        • **IntelliJ IDEA**
      • **常見問題解決**
    • YAML
      • 1. YAML 語法文件 (`YAML.g4`)
      • 2. 語法說明
      • 3. 生成解析器
      • 4. 解析樹可視化
      • 5. 支持的 YAML 特性
      • 6. 擴展建議
      • 7. 完整解析流程
    • JSON
      • 1. JSON 語法文件 (`JSON.g4`)
      • 2. 語法說明
      • 3. 生成解析器
      • 4. 解析樹可視化
      • 5. 支持的 JSON 特性
      • 6. 擴展建議
      • 7. 性能優化
    • Latex
      • 1. LaTeX 語法文件 (`LaTeX.g4`)
      • 2. 語法樹結構說明
      • 3. 解析示例
        • 輸入 LaTeX 文件 (`example.tex`):
        • Java 解析代碼:
        • 生成的解析樹結構:
      • 4. 關鍵特性支持
      • 5. 擴展建議
      • 6. 典型應用場景

最近接觸到數學公式的解析,然后和ANTLR4進行了一場遭遇戰。

以下是使用 ANTLR4 解析 YAML 文件的完整語法文件 (YAML.g4) 和解析示例:

ANTLR4基本使用

以下是安裝 ANTLR4 命令行工具的詳細步驟,適用于主流操作系統:


1. 安裝 Java 運行時(必需)

ANTLR4 是基于 Java 的工具,需先安裝 Java 11+

# 檢查是否已安裝 Java
java -version
  • 如果未安裝,從 Oracle JDK 或 OpenJDK 下載。

2. 安裝 ANTLR4 命令行工具

方法一:通過包管理器(推薦)
macOS/Linux (Homebrew)
brew install antlr
Windows (Chocolatey)
choco install antlr4
方法二:手動安裝(通用)
  1. 下載最新版 ANTLR4 JAR 文件:

    curl -O https://www.antlr.org/download/antlr-4.12.0-complete.jar
    

    替換 4.12.0 為官網最新版本號。

  2. 將 JAR 文件移動到固定目錄(如 ~/lib/antlr):

    mkdir -p ~/lib/antlr
    mv antlr-4.12.0-complete.jar ~/lib/antlr/
    
  3. 添加別名到 Shell 配置文件(.bashrc/.zshrc/.bash_profile):

    # ANTLR4 別名
    alias antlr4='java -jar ~/lib/antlr/antlr-4.12.0-complete.jar'
    alias grun='java org.antlr.v4.gui.TestRig'
    

    然后執行:

    source ~/.bashrc  # 或對應配置文件
    

3. 驗證安裝

antlr4

如果看到以下輸出,表示安裝成功:

ANTLR Parser Generator  Version 4.12.0
...

4. 配置環境變量(可選)

若不想用別名,可將 ANTLR4 加入 PATH

macOS/Linux
export CLASSPATH=".:~/lib/antlr/antlr-4.12.0-complete.jar:$CLASSPATH"
export PATH="$PATH:~/lib/antlr"
Windows
  1. 右鍵“此電腦” → 屬性 → 高級系統設置 → 環境變量
  2. PATH 中添加 ANTLR4 JAR 所在目錄
  3. 新建 CLASSPATH 變量,值為 .;C:\path\to\antlr-4.12.0-complete.jar

5. 使用示例

(1) 生成解析器
antlr4 YourGrammar.g4  # 生成詞法/語法分析器
javac *.java           # 編譯生成的 Java 文件
(2) 測試語法樹
grun YourGrammar ruleName -gui  # 可視化解析樹

輸入文本后按 Ctrl+D (macOS/Linux) 或 Ctrl+Z (Windows) 結束輸入。


6. 開發工具集成

Visual Studio Code
  1. 安裝擴展:
    • ANTLR4 Grammar Syntax Support
  2. 右鍵 .g4 文件 → “Generate ANTLR Code”
IntelliJ IDEA
  1. 安裝插件:
    • ANTLR v4 grammar plugin (內置)
  2. 右鍵 .g4 文件 → “Generate ANTLR Recognizer”

常見問題解決

  1. antlr4: command not found
    檢查別名或環境變量配置是否正確。

  2. Java 版本不兼容
    確保使用 Java 11+:

    java -version
    
  3. 無法生成代碼
    檢查語法文件是否有錯誤,或嘗試手動指定輸出目錄:

    antlr4 -o ./output YourGrammar.g4
    

通過以上步驟,您可以在任何主流操作系統上安裝并運行 ANTLR4 命令行工具。如需更高級的功能(如自定義 Visitor/Listener),可參考 ANTLR4 官方文檔。

YAML

1. YAML 語法文件 (YAML.g4)

grammar YAML;// 語法規則
document: blockMapping?;blockMapping: blockPair+;blockPair: key ':' value;key: SCALAR;value: SCALAR| blockMapping| blockSequence;blockSequence: '-' value ('\n' '-' value)*;// 詞法規則
SCALAR: UNQUOTED_SCALAR| SINGLE_QUOTED_SCALAR| DOUBLE_QUOTED_SCALAR;UNQUOTED_SCALAR: [a-zA-Z0-9_\-\.]+;SINGLE_QUOTED_SCALAR: '\'' (~['\n] | '\'\'')* '\'';DOUBLE_QUOTED_SCALAR: '"' (~["\n] | '\\"')* '"';COMMENT: '#' ~[\n]* -> skip;WS: [ \t\r\n]+ -> skip;// 特殊字符處理
COLON : ':' ;
DASH  : '-' ;

2. 語法說明

  1. 文檔結構

    • 一個 YAML 文檔由可選的 blockMapping 組成
    • blockMapping 包含多個鍵值對 (blockPair)
  2. 鍵值對

    • 鍵 (key) 必須是標量 (SCALAR)
    • 值 (value) 可以是:
      • 標量
      • 嵌套的映射 (blockMapping)
      • 序列 (blockSequence)
  3. 序列

    • - 開頭
    • 可以包含多行
  4. 標量類型

    • 未加引號的 (UNQUOTED_SCALAR):字母數字、下劃線、連字符、點
    • 單引號 (SINGLE_QUOTED_SCALAR):支持單引號轉義 ('')
    • 雙引號 (DOUBLE_QUOTED_SCALAR):支持反斜杠轉義 (\")
  5. 忽略

    • 注釋 (# 開頭)
    • 空白字符 (空格、制表符、換行)

3. 生成解析器

  1. 使用 ANTLR4 工具生成代碼:
antlr4 YAML.g4
javac YAML*.java
  1. 使用生成的解析器 (Java 示例):
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;public class YAMLParserExample {public static void main(String[] args) throws Exception {String yaml = """name: John Doeage: 30address:street: 123 Main Stcity: Anytownhobbies:- hiking- reading""";CharStream input = CharStreams.fromString(yaml);YAMLLexer lexer = new YAMLLexer(input);CommonTokenStream tokens = new CommonTokenStream(lexer);YAMLParser parser = new YAMLParser(tokens);ParseTree tree = parser.document();// 打印解析樹System.out.println(tree.toStringTree(parser));}
}

4. 解析樹可視化

使用 ANTLR 的 grun 工具查看解析樹:

grun YAML document -gui <<EOF
name: John Doe
age: 30
EOF

5. 支持的 YAML 特性

特性是否支持示例
鍵值對?key: value
嵌套映射?parent: {child: value}
列表?- item1\n- item2
多行字符串?`text:
錨點與引用?&anchor\n key: value
復雜數據類型?!!timestamp 2023-01-01

6. 擴展建議

  1. 支持多行字符串
    添加 MULTILINE_SCALAR 規則:

    MULTILINE_SCALAR: '|' '\n' (' ' | '\t')* ~[\n]* ('\n' (' ' | '\t')* ~[\n]*)*;
    
  2. 支持類型標簽

    value: SCALAR| tag SCALAR| blockMapping| blockSequence;tag : '!!' [a-zA-Z]+ ;
    
  3. 錯誤處理
    添加 error 規則捕獲非法輸入:

    ERROR_CHAR : . ;
    

7. 完整解析流程

graph TDA[YAML 輸入] --> B[詞法分析 (Lexer)]B --> C[Token 流]C --> D[語法分析 (Parser)]D --> E[解析樹]E --> F[遍歷樹 (Visitor/Listener)]

這個語法文件提供了 YAML 的核心功能解析,可根據實際需求進一步擴展。

JSON

以下是適用于 ANTLR4 的 JSON 語法文件 (JSON.g4),完整支持 JSON 標準(RFC 8259):


1. JSON 語法文件 (JSON.g4)

grammar JSON;// 語法規則
json: value;value: object| array| STRING| NUMBER| 'true'| 'false'| 'null';object: '{' pair (',' pair)* '}'| '{' '}';pair: STRING ':' value;array: '[' value (',' value)* ']'| '[' ']';// 詞法規則
STRING: '"' (ESC | SAFE_CHAR)* '"';fragment ESC: '\\' (["\\/bfnrt] | UNICODE);fragment UNICODE: 'u' HEX HEX HEX HEX;fragment HEX: [0-9a-fA-F];fragment SAFE_CHAR: ~["\\\u0000-\u001F];NUMBER: '-'? INT ('.' [0-9]+)? EXP?;fragment INT: '0' | [1-9] [0-9]*;fragment EXP: [Ee] [+-]? [0-9]+;WS: [ \t\n\r]+ -> skip;

2. 語法說明

  1. 結構定義

    • json: 根規則,表示一個 JSON 文檔
    • value: 可以是對象、數組、字符串、數字、布爾值或 null
    • object: 鍵值對集合(如 {"key": "value"}
    • array: 值列表(如 [1, "a", true]
  2. 詞法規則

    • STRING: 支持轉義字符(\n, \uXXXX 等)
    • NUMBER: 支持整數、浮點數和科學計數法
    • WS: 跳過空白字符
  3. 嚴格校驗

    • 字符串必須用雙引號(")包裹
    • 不允許尾隨逗號(如 [1, 2,] 會報錯)

3. 生成解析器

  1. 生成 Java 代碼

    antlr4 JSON.g4
    javac JSON*.java
    
  2. 測試解析(Java 示例):

    import org.antlr.v4.runtime.*;
    import org.antlr.v4.runtime.tree.*;public class JSONParserExample {public static void main(String[] args) throws Exception {String json = """{"name": "Alice","age": 30,"scores": [90, 85, 95]}""";CharStream input = CharStreams.fromString(json);JSONLexer lexer = new JSONLexer(input);CommonTokenStream tokens = new CommonTokenStream(lexer);JSONParser parser = new JSONParser(tokens);ParseTree tree = parser.json(); // 從根規則開始解析System.out.println(tree.toStringTree(parser));}
    }
    

4. 解析樹可視化

使用 ANTLR 的 grun 工具查看解析樹:

grun JSON json -gui <<EOF
{"key": "value"}
EOF

會顯示如下結構:

(json (value (object { (pair "key" : (value "value")) })))

5. 支持的 JSON 特性

特性示例是否支持
對象{"key": "value"}?
數組[1, "a", true]?
嵌套結構{"a": {"b": [1, 2]}}?
字符串轉義"Line\nBreak"?
Unicode 字符"\u03B1" (α)?
科學計數法數字1.23e-4?
布爾值/nulltrue, false, null?
尾隨逗號{"a": 1,}?
單引號字符串{'key': 'value'}?

6. 擴展建議

  1. 支持注釋(非標準 JSON):

    COMMENT: '/*' .*? '*/' -> skip| '//' ~[\n]* -> skip;
    
  2. 寬松模式(允許尾隨逗號):

    object: '{' pair (',' pair)* ','? '}'| '{' '}';
    
  3. 自定義錯誤處理

    parser.addErrorListener(new BaseErrorListener() {@Overridepublic void syntaxError(...) {throw new RuntimeException("Syntax error at line " + line + ":" + charPositionInLine + " - " + msg);}
    });
    

7. 性能優化

  1. 預編譯解析器:在多次解析時復用 Lexer/Parser 實例
  2. 關閉冗余功能:禁用 ANTLRErrorListener 提升速度
    lexer.removeErrorListeners();
    parser.removeErrorListeners();
    

此語法文件完全兼容標準 JSON,可直接用于構建 JSON 解析器、驗證器或轉換工具。如需處理非標準 JSON(如帶注釋的配置文件),按需擴展即可。

Latex

以下是適用于 ANTLR4 的 LaTeX 語法文件 (LaTeX.g4),定義了包含 documentclasssectionitemtask 等常見標記的語法樹結構:


1. LaTeX 語法文件 (LaTeX.g4)

grammar LaTeX;// 語法規則
document: preamble? (section | item | task | textContent)*;preamble: '\\documentclass' '{' ID '}' ('[' options ']')?;section: '\\section' '{' textContent '}' (subsection)?;subsection: '\\subsection' '{' textContent '}';item: '\\item' (textContent | itemize | enumerate);itemize: '\\begin{itemize}' item* '\\end{itemize}';enumerate: '\\begin{enumerate}' item* '\\end{enumerate}';task: '\\task' '{' textContent '}' ('\\solution' '{' textContent '}')?;textContent: (TEXT | COMMAND | MATH)+;// 詞法規則
COMMAND: '\\' [a-zA-Z]+;MATH: '$' .*? '$';ID: [a-zA-Z]+;TEXT: ~[\\{}[\]]+;OPTION_SEP: ',';LBRACE : '{';
RBRACE : '}';
LBRACK : '[';
RBRACK : ']';WS: [ \t\r\n]+ -> skip;// 復合規則
options: ID (OPTION_SEP ID)*;

2. 語法樹結構說明

  1. 文檔結構

    Document
    Preamble
    Section
    Item
    Task
    TextContent
  2. 節點類型

    • preamble: \documentclass 聲明
    • section/subsection: 章節標題
    • item: 列表項(可嵌套在 itemizeenumerate 中)
    • task: 自定義任務環境(帶可選的 \solution
    • textContent: 文本、命令或數學公式的混合內容
  3. 嵌套規則

    • 列表可以嵌套 (item 包含 itemize/enumerate)
    • textContent 可以包含任意文本和命令

3. 解析示例

輸入 LaTeX 文件 (example.tex):
\documentclass{article}
\section{Introduction}
This is a \textbf{test}.
\begin{itemize}\item First point\item Second point with math: $E=mc^2$
\end{itemize}
\task{Solve the equation}{ \solution{ $x=1$ } }
Java 解析代碼:
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;public class LaTeXParserExample {public static void main(String[] args) throws Exception {CharStream input = CharStreams.fromFileName("example.tex");LaTeXLexer lexer = new LaTeXLexer(input);CommonTokenStream tokens = new CommonTokenStream(lexer);LaTeXParser parser = new LaTeXParser(tokens);ParseTree tree = parser.document();// 打印解析樹System.out.println(tree.toStringTree(parser));// 使用Visitor遍歷new LaTeXBaseVisitor<Void>() {@Overridepublic Void visitSection(LaTeXParser.SectionContext ctx) {System.out.println("Section: " + ctx.textContent().getText());return super.visitSection(ctx);}}.visit(tree);}
}
生成的解析樹結構:
(document (preamble \documentclass { article }) (section \section { Introduction } (textContent This is a \textbf { test })) (itemize (item \item (textContent First point)) (item \item (textContent Second point with math: $E=mc^2$))) (task \task { Solve the equation } (solution \solution { $x=1$ })))

4. 關鍵特性支持

LaTeX 結構是否支持示例
文檔類聲明?\documentclass{article}
章節標題?\section{Introduction}
無序列表?\itemize \item ...
有序列表?\enumerate \item ...
自定義命令?\textbf{text}
數學公式?$E=mc^2$
自定義環境?\task{...}\solution{...}
可選參數?\documentclass[12pt]{...}
嵌套結構?列表中的列表

5. 擴展建議

  1. 支持更多環境

    figure: '\\begin{figure}' ('[' options ']')? content '\\end{figure}';
    
  2. 完善數學公式

    MATH: '$' .*? '$'| '\\[' .*? '\\]';
    
  3. 錯誤恢復
    添加 error 規則:

    UNKNOWN_CMD: '\\' ~[a-zA-Z] -> skip;
    
  4. 注釋處理

    COMMENT: '%' ~[\n]* -> skip;
    

6. 典型應用場景

  1. LaTeX 文檔分析

    • 提取所有章節標題
    • 統計數學公式數量
  2. 自動化批改系統

    • 解析 \task\solution 環境
    • 對比學生答案與標準解
  3. 文檔轉換

    • 將 LaTeX 列表轉為 Markdown
    • 提取文檔結構生成目錄

這個語法文件提供了 LaTeX 的核心結構解析,可根據實際需求進一步擴展復雜環境(如表格、圖表等)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75975.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75975.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75975.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NixVis 開源輕量級 Nginx 日志分析工具

NixVis NixVis 是一款基于 Go 語言開發的、開源輕量級 Nginx 日志分析工具&#xff0c;專為自部署場景設計。它提供直觀的數據可視化和全面的統計分析功能&#xff0c;幫助您實時監控網站流量、訪問來源和地理分布等關鍵指標&#xff0c;無需復雜配置即可快速部署使用。 演示…

黑盒測試的等價類劃分法(輸入數據劃分為有效的等價類和無效的等價類)

重點: 有效等價和單個無效等價各取1個即可 1、正向用例:一條盡可能覆蓋多條2、逆向用例:每一條數據&#xff0c;都是一條單獨用例。 步驟: 1、明確需求 2、確定有效和無效等價 3、根據有效和無效造數據編寫用例 3、適用場景 針對:需要有大量數據測試輸入&#xff0c; …

Linux Mem -- 通過reserved-memory縮減內存

目錄 1. reserved-memory縮減內存 2. 為什么要通過2段512GB預留內存實現該縮減呢&#xff1f; 3. reserved-momery中的no-map屬性 4. 預留的的內存是否會被統計到系統MemTotal中&#xff1f; 本文是解決具體的一些思考總結&#xff0c;和Linux內核的reserved-memory機制相關…

多線程—synchronized原理

上篇文章&#xff1a; 多線程—鎖策略https://blog.csdn.net/sniper_fandc/article/details/146508232?fromshareblogdetail&sharetypeblogdetail&sharerId146508232&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目錄 1 synchronized的鎖…

AWS混合云部署實戰:打造企業級數字化轉型的“黃金架構”

引言 “上云是必然&#xff0c;但全部上云未必是必然。”在數字化轉型的深水區&#xff0c;企業面臨的核心矛盾日益凸顯&#xff1a;如何在享受公有云敏捷性的同時&#xff0c;滿足數據主權、低延遲和遺留系統兼容的剛性需求&#xff1f; AWS混合云憑借“云上云下一張網”的獨…

進程模型5-0號進程

內核版本架構作者GitHubCSDNLinux-3.0.1armv7-ALux1206 0號進程的作用 在 Linux 中除了 init_task 0號進程&#xff0c;所有的線/進程都是通過 do_fork 函數復制父線/進程創建得到&#xff0c;因為 0號進程產生時沒有任何進程可以參照&#xff0c;只能通過靜態方式構造進程描述…

計算機二級考前急救(Word篇)

重點題&#xff08;20套&#xff0c;標黃為精選10套&#xff09;&#xff1a;4&#xff0c;15&#xff0c;17&#xff0c;19&#xff0c;21&#xff0c;24&#xff0c;25&#xff0c;27&#xff0c;36&#xff0c;40&#xff0c;12&#xff0c;18&#xff0c;20&#xff0c;22&…

constant(safe-area-inset-bottom)和env(safe-area-inset-bottom)在uniapp中的使用方法解析

在微信小程序中&#xff0c;padding-bottom: constant(safe-area-inset-bottom); 和 padding-bottom: env(safe-area-inset-bottom); 這兩個 CSS 屬性用于處理 iPhone X 及更高版本設備的安全區域&#xff08;safe area&#xff09;。這些設備的底部有一個“Home Indicator”&a…

十二、Cluster集群

目錄 一、集群簡介1、現狀問題2、集群作用 二、集群結構設計1、集群存儲設2、消息通信設計 三、Cluster集群三主三從結構搭建1、redis.conf配置文件可配置項2、配置集群3、鏈接集群4、命令客戶端連接集群并使用 四、集群擴容1、添加節點2、槽位分配3、添加從節點 五、集群縮容1…

Java基礎 3.29

1.數組的相關注意事項 錯誤示范一 String strs[] new String[2]{"a", "b"}; 正確示范一 String strs[] new String[]{"a", "b"}; 讓JVM自己判斷有幾個數據&#xff0c;無需再其中寫明有幾組數據 錯誤示范二 String strs[] new…

從入門到精通:HTML 項目實戰中的學習進度(一)

一、基礎夯實階段 1.1 HTML 文檔結構與核心語法 在 HTML5 的世界里&#xff0c;構建一個文檔就像是搭建一座大廈&#xff0c;堅實的基礎至關重要。HTML5 文檔的基礎框架以<!DOCTYPE html>聲明開場&#xff0c;這就好比是給瀏覽器下達的一份 “指令書”&#xff0c;明確…

FFmpeg —— 實時繪制音頻波形圖(附源碼)

?? FFmpeg 相關音視頻技術、疑難雜癥文章合集(掌握后可自封大俠 ?_?)(記得收藏,持續更新中…) 實時繪制音頻波形圖 步驟 ????? ??????????FFmpeg打開媒體文件,讀取每一包數據,將音頻數據包進行緩沖,一包一包處理音頻緩沖,對音頻緩沖包進行解碼,讀…

大數據學習(88)-zookeeper實現的高可用(HA)

&#x1f34b;&#x1f34b;大數據學習&#x1f34b;&#x1f34b; &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一…

基于MFC按鈕邏輯

void CSUCCES1Dlg::SetDlgItemState()//IDC_BTN_INIT初始化按鈕 { GigeState state = GigeState::ARV_NONE;//GigeState是一個枚舉類型,stat狀態為ARV_NONE int idx = ((CListBox*)GetDlgItem(IDC_LIST_GIGE))->GetCurSel();//GetDlgItem 是 MFC 框架提供的一個成員…

EF Core 樂觀并發控制(并發令牌)

文章目錄 前言一、樂觀并發的核心思想二、實現方法1&#xff09;使用并發令牌&#xff08;Concurrency Token&#xff09;2&#xff09;處理并發沖突 三、工作原理四、適用場景五、與悲觀并發的對比六、最佳實踐總結 前言 Entity Framework (EF) Core 默認支持 樂觀并發控制&a…

解決 FFmpeg 使用 C/C++ 接口時,解碼沒有 shell 快的問題(使用多線程)

一、問題 硬件設備為香橙派 5Plus&#xff0c;最近需要使用硬件視頻解碼來加速 YOLO 的檢測&#xff0c;shell 窗口的FFmpeg已經調通&#xff0c;詳見文章&#xff1a; 編譯支持 RKmpp 和 RGA 的 ffmpeg 源碼_rk3588 ffmpeg mpp-CSDN博客https://blog.csdn.net/plmm__/article…

工業控制網絡中常用的通信協議

1. 現場總線協議 Modbus 概述&#xff1a;Modbus 是最廣泛使用的工業協議之一&#xff0c;主要用于串行通信&#xff0c;支持主/從架構&#xff0c;通過 RS-232 或 RS-485 傳輸&#xff0c;也有基于以太網的 Modbus TCP 版本。特點&#xff1a;簡單易用&#xff0c;易于實現&am…

【Mac】npm error Error: EACCES: permission denied, mkdir‘/Users/...

問題描述&#xff1a;Mac電腦中的 vscode 下載依賴的時候提示沒有權限&#xff1a; 故障分析 首先賬號是有權限的&#xff0c;電腦就建了一個賬號是管理員&#xff1b;在桌面用shell直接執行命令npm init 命令可以執行成功&#xff0c;那么問題就出在vscodes上面了&#xff0…

Ruby 簡介

Ruby 簡介 引言 Ruby 是一種廣泛使用的動態、開源的編程語言,自 1995 年由日本程序員 Yukihiro Matsumoto(通稱 Matz)設計以來,它以其優雅的語法、強大的庫支持和跨平臺特性贏得了全球開發者的青睞。本文將詳細介紹 Ruby 的起源、特點、應用領域以及它在現代軟件開發中的…

[Qt5] QMetaObject::invokeMethod使用

&#x1f4e2;博客主頁&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01;&#x1f4e2;本文由 丶布布原創&#xff0c;首發于 CSDN&#xff0c;轉載注明出處&#x1f649;&#x1f4e2;現…