From 79d8c4fd054375ba5467e9cf1d26872e1ee9ebec Mon Sep 17 00:00:00 2001 From: zhangmenghan Date: Thu, 27 Mar 2025 19:58:30 +0800 Subject: [PATCH 1/3] antlr4_1 Signed-off-by: zhangmenghan --- .../ohosgen/doc/Antlr4_readme.md | 1931 +++++++++++++++++ .../ohosgen/doc/images/image-1.png | Bin 0 -> 9419 bytes .../ohosgen/doc/images/image-10.png | Bin 0 -> 34816 bytes .../ohosgen/doc/images/image-2.png | Bin 0 -> 15470 bytes .../ohosgen/doc/images/image-3.png | Bin 0 -> 28819 bytes .../ohosgen/doc/images/image-4.png | Bin 0 -> 9961 bytes .../ohosgen/doc/images/image-5.png | Bin 0 -> 14538 bytes .../ohosgen/doc/images/image-6.png | Bin 0 -> 5766 bytes .../ohosgen/doc/images/image-7.png | Bin 0 -> 4067 bytes .../ohosgen/doc/images/image-8.png | Bin 0 -> 13958 bytes .../ohosgen/doc/images/image-9.png | Bin 0 -> 12945 bytes 11 files changed, 1931 insertions(+) create mode 100644 src/intellij_plugin/ohosgen/doc/Antlr4_readme.md create mode 100644 src/intellij_plugin/ohosgen/doc/images/image-1.png create mode 100644 src/intellij_plugin/ohosgen/doc/images/image-10.png create mode 100644 src/intellij_plugin/ohosgen/doc/images/image-2.png create mode 100644 src/intellij_plugin/ohosgen/doc/images/image-3.png create mode 100644 src/intellij_plugin/ohosgen/doc/images/image-4.png create mode 100644 src/intellij_plugin/ohosgen/doc/images/image-5.png create mode 100644 src/intellij_plugin/ohosgen/doc/images/image-6.png create mode 100644 src/intellij_plugin/ohosgen/doc/images/image-7.png create mode 100644 src/intellij_plugin/ohosgen/doc/images/image-8.png create mode 100644 src/intellij_plugin/ohosgen/doc/images/image-9.png diff --git a/src/intellij_plugin/ohosgen/doc/Antlr4_readme.md b/src/intellij_plugin/ohosgen/doc/Antlr4_readme.md new file mode 100644 index 00000000..781179e0 --- /dev/null +++ b/src/intellij_plugin/ohosgen/doc/Antlr4_readme.md @@ -0,0 +1,1931 @@ +# Antlr4使用教程 + +## 一、Antlr4工具介绍 + +Antlr4(Another Tool for Language Recognition)是一款基于Java开发的开源的语法分析器生成工具,能够根据语法规则文件生成对应的语法分析器,广泛应用于DSL构建,语言词法语法解析等领域。 + +## 二、安装和配置(windows10) + +ANTLR依赖Java环境,所以必须要安装JDK 1.6+,并设置好环境变量。 + +1. 下载安装 + +可通过以下方式安装,两者选其一就好: + +官网下载:https://www.antlr.org/download.html +命令行安装:curl -O https://www.antlr.org/download/antlr-4.13.2-complete.jar + +2. 测试下ANTLR工具是否工作正常: + + ``` + java -jar antlr-4.13.2-complete.jar + ``` + + ​ 将工具存放在特定文件夹中方便日后寻找,例如C:\Users\zxj\TOOLS\ANTLR4,在该文件夹下新建bat文件夹,新增两文件antlr4.bat和grun.bat,内容分别如下: + + ``` + java org.antlr.v4.Tool %* //antlr4.bat + ``` + + ``` + java org.antlr.v4.gui.TestRig %* //grun.bat + ``` + +3. 配置环境变量 + 1) 修改CLASSPATH + 打开环境变量,选择“系统变量”中的“CLASSPATH”,双击打开,如果系统变量中没有“CLASSPATH”,需新建“CLASSPATH”,在变量值中做如下添加: + ![image-1](.\images\image-1.png) + ![image-2](.\images\image-2.png) + ps:需要有一个 点(.)。 + 2)修改Path + 找到系统变量中的Path进行修改,双击打开,点击“新建”,添加C:\Users\zxj\TOOLS\ANTLR4\bat\到末尾,点击“确定”(C:\Users\zxj\TOOLS\ANTLR4为前面提到的antlr-4.13.2-complete.jar存放的文件夹)。 + +路径添加完毕!重启电脑让路径生效。 + +3. 测试下是否安装成功:在cmd中输入antlr4,回车,观察输出是否如下图。 + [![image-3](.\images\image-3.png)](https://postimg.cc/Lgp6KbD3) + 在cmd中输入grun,回车,观察输出是否如下图,如果正常的话,那到这里就说明我们的安装和配置已经成功! + ![image-4](.\images\image-4.png) + +## 三、语法文件编写 + +语法文件整体结构如下: + +``` +/** Optional javadoc style comment */ + +grammar Name; + +options {...} + +import ... ; + + + +tokens {...} + +channels {...} // lexer only + +@actionName {...} + + + +rule1 // parser and lexer rules, possibly intermingled + +... + +ruleN +``` + +- **grammar Name**是词法跟语法都在同一个文件声明的写法,称之为**combined**。若要分开,可以使用lexer grammar Name和parser grammar Name。需要注意的是,Name要和文件名保持一致。 + +- **options**可以是如下四个选项: + + superClass:指定生成xxxLexer.java、xxxParser.java的父类。 + language:生成目标语言,如java。 + tokenVocab:导入外部词法文件(用于拆分大型语法)。 + TokenLabelType:默认的是antlr的Token类型,这里可以使用自定义的token类,如MyToken。需要配合TokenFactory使用 + +- **import**导入其他语法文件的规则,lexer grammer只能导入lexer grammer,parser grammer只能导入parser grammer,混合语法可以同时导入以上两者。 + +- **tokens**定义虚拟Token,用于在语法树上标记节点,不用于匹配具体字符。 + +- **actionName** 可以是如下内容 + + @header:在生成的代码文件头部插入内容(如包声明、导入语句)。 + @member:在生成的分析器中添加成员变量或添加方法。 + + 如果要指定在lexer或者parser中,可以使用 @lexer::member、@parser::member。 + +- **channels**将某些词法规则分配到特定通道,如隐藏注释但不丢弃 + +- **rule** 词法规则和语法规则 + + *lexer示例* + + ``` + lexer grammar HelloLexer; + HI : 'H' 'i' + ID : [a-z]+; + WS : [\t\n\r\s]+ -> skip; + ``` + + *parser示例* + + ``` + parser grammar HelloParser; + options { + language=Java; + tokenVocab=HelloLexer; + } + + @header { + package com.laudandjolynn.antlr; + import java.util.Set; + import java.util.HashSet; + } + @member { + private int count; + public int getCount() { + return count; + } + } + start : HI ID; + ``` + +- 词法规则以大写字母开头,定义了如何将输入文本分解成词法单元(tokens)。词法规则使用正则表达式来定义匹配模式。 + +- 语法规则以小写字母开头,规则通过组合词法单元和其他语法规则来定义语法结构,例如 + +``` +expr : expr op=('*'|'/') expr # MulDiv + | expr op=('+'|'-') expr # AddSub + | INT # int + | '(' expr ')' # parens + ; +``` + +1. 常见的语言模式 + + 1)序列模式 + + 它是一个任意长的,可能为空的序列,其中的元素可以是词法符号或者子规则。比如一个协议语言POP,由关键字、整数和换行组成,如下: + + ``` + retr : 'RETR' INT '\n' + ``` + + 任意长度序列可以用 `+` 字符。`(INT)+` 或者 `INT+`。 + + 2)选择模式(多个备选分支) + + 使用符号 `|` 作为“或者”来表达编程语言中的选择模式。备选分支或者可生成的结果。 + + ``` + type : 'float' | 'int' | 'void' + ``` + + 3)词法符号依赖 + + 依赖符号的语法,比如数组的括号。表达对符号的依赖的方法。 + + ``` + vector : '[' INT+ ']' ; // [1], [1 2], [1 2 3], ... + ``` + + 以方法定义为例,它的语法表示如下: + + ``` + functionDecl + : type ID '{' formalParameters? '}' + ; + formalParameters + : formalParameter (',' formalParameter)* + ; + formalParameter + : type ID + ``` + + 4)嵌套结构 + + 自己引用自己。如果一条规则定义中的伪代码引用了它自身,就需要一条递归规则(自引用规则)。例如: + + ``` + expr: ID '[' expr ']' //a[1],a[b[1]],a[(2*b[1])] + | '(' expr ')' //(1),(a[1]),(((1))),(2*a[1]) + | INT + ; + ``` + +“|”、“?“等记号在语法文件中比较常见,其功能如下方表格: + +| 用法 | 描述 | +| --------------------- | --------------------------------- | +| x | 匹配词法符号、规则引用或者子规则x | +| x y ... z | 匹配一列规则元素 | +| (... \| ... \| ...) | 一个具有多个备选分支的子规则 | +| x? | 匹配x或者忽略它 | +| x* | 匹配x零次或多次 | +| x+ | 匹配x一次或多次 | +| r: ...; | 定义规则r | +| r: ... \| ... \| .... | 定义具有多个备选分支的规则r | + +2. 左递归和优先级:直接或间接调用在选项左边缘的自身的规则,写在前面的语法拥有较高的优先级。ANTLR可以处理直接左递归,不能处理间接左递归。如果遇到从右向左结合的,需要使用assoc手工指定结合性: + +``` +expr : expr '^' expr + | INT + ; +``` + +3. 识别词法 + +- 匹配标识符 + + ``` + ID : [a-zA-z]+ ;//匹配一个或多个大小写字母 + ``` + + 或者 + + ``` + ID : ('a'..'z'|'A'..'Z')+ ; + ``` + + ID规则可能和其他规则冲突,譬如其他关键字enum + +- 匹配数字 + + i)整数 + + ``` + INT : [0-9]+ ; + ``` + + 或者 + + ``` + INT : '0'..'9'+ ; + ``` + + ii)浮点数 + + ``` + FLOAT : DIGIT+ '.' DIGIT* // 1. 3.14 + | '.' DIGIT+ // .1 .1415 + ; + fragment + DIGIT : [0-9] ; // 单个数字 + ``` + + fragment:词法片段,构成词法的元素,不是一个词法规则。在词法规则中可引用一个或多个词法片段。 + +- 字符串 + + ``` + STRING : '"' .*? '"' ; + ``` + + `.` 匹配任意单个字符,`.*` 匹配零个或多个,`?` 标记表示使用非贪婪匹配子规则(nongreedy subrule)。 + + ``` + //转义字符 + STRING : '"' (ESC|.)*? '"' ; + fragment + ESC : '\\"' | '\\\\' ; // 转义 \" 和 \\ + ``` + +- 注释和空白字符 + + C 中的单行和多行注释: + + ``` + LINE_COMINT : '//' .*? '\r'? '\n' -> skip ; // 消费掉双斜杠后面的一切字符,直到遇到换行符 + ``` + + 空白字符: + + ``` + WS : [ \t\r\n]+ -> skip ; + ``` + +## 四、示例 + +1. 新建一个文件夹,然后在文件夹中新建一个语法文件Hello.g4,文件内容如下: + + ``` + grammar Hello; // 定义文法的名字 + + r : 'hello' ID ; // 匹配关键字hello和标志符 + ID : [a-z]+ ; // 标志符由小写字母组成 + WS : [ \t\r\n]+ -> skip ; // 跳过空格、制表符、回车符和换行符 + ``` + +2. 在语法文件所在目录下打开命令行窗口,输入命令 + + ``` + antlr4 Hello.g4 + ``` + + 运行ANTLR命令编译该语法文件生成词法分析器和语法分析器如下: + + [![image-5](.\images\image-5.png)](https://postimg.cc/WqTjfJp9) + +3. 编译生成文件的java代码 + + ``` + javac *.java + ``` + +4. 用ANTLR运行库提供的语法调试工具TestRig来对语法文件进行测试,测试命令如下 + + ``` + grun GrammerName startRuleName [options] + ``` + + 其中GrammerName是指语法文件名称(不含后缀),startRuleName是指语法文件中起始规则的名称,options是指TestRig参数,常用的参数如下: + + | 选项 | 功能说明 | 示例用法 | + | --------- | -------------------------- | ---------------------- | + | `-tokens` | 打印词法符号流 | `grun Hello r -tokens` | + | `-tree` | 以LISP格式打印语法树 | `grun Hello r -tree` | + | `-gui` | 以可视化方式显示语法分析树 | `grun Hello r -gui` | + + 在语法文件所在目录的命令行窗口输入 `grun Hello r -tokens`,按回车,然后按Ctrl+Z,再次回车,会得到 + + ![image-6](.\images\image-6.png) + + 在语法文件所在目录的命令行窗口输入 `grun Hello r -tree`,按回车,然后按Ctrl+Z,再次回车,会得到 + + ![image-7](.\images\image-7.png) + + 在语法文件所在目录的命令行窗口输入 `grun Hello r -gui`,按回车,然后按Ctrl+Z,再次回车,会得到 + + [![image-8](.\images\image-8.png) + + 还有一些其他的TestRig参数如下: + + | 选项 | 功能说明 | 示例用法 | + | ------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | + | `-ps file.ts` | 以PostScript格式生成可视化语法分析树并存储在相应文件中 | `run Hello r -ps file.ps` | + | `-encoding encodingname` | 指定测试输入文件的编码,若当前区域设定无法正确读取输入时使用 | `grun Hello r -encoding UTF-8` | + | `-trace` | 打印规则的名字以及进入和离开该规则时的词法符号,用于调试 | `grun Hello r -trace` | + | `-diagnostics` | 开启解析过程中的调试信息输出,通常在输入文本有歧义等特殊情况下使用 | `grun Hello r -diagnostics` | + | `-SLL` | 使用更快但受限的解析策略(默认策略为 `LL(*)`) | `grun Hello r -SLL` | + | `input-filename(s)` | 输入测试文本文件名,从控制台输入时忽略此参数 | `grun Hello r -gui aa.txt`(aa.txt是同级目录下的测试文本文件) | + +## 五、进阶版示例 + +这是一个生成TypeScript解析器来解析CPP14代码的示例。 + +1. 新建一个文件夹,在文件夹中新建一语法文件CPP14.g4,文件内容如下: + + ``` + grammar CPP14; + + options { + superClass = CPP14ParserBase; + } + + /*Basic concepts*/ + translationUnit + : declarationseq? EOF + ; + + /*Expressions*/ + primaryExpression + : literal+ + | This + | LeftParen expression RightParen + | idExpression + | lambdaExpression + ; + + idExpression + : unqualifiedId + | qualifiedId + ; + + unqualifiedId + : Identifier + | operatorFunctionId + | conversionFunctionId + | literalOperatorId + | Tilde (className | decltypeSpecifier) + | templateId + ; + + qualifiedId + : nestedNameSpecifier Template? unqualifiedId + ; + + nestedNameSpecifier + : (theTypeName | namespaceName | decltypeSpecifier)? Doublecolon + | nestedNameSpecifier ( Identifier | Template? simpleTemplateId) Doublecolon + ; + + lambdaExpression + : lambdaIntroducer lambdaDeclarator? compoundStatement + ; + + lambdaIntroducer + : LeftBracket lambdaCapture? RightBracket + ; + + lambdaCapture + : captureList + | captureDefault (Comma captureList)? + ; + + captureDefault + : And + | Assign + ; + + captureList + : capture (Comma capture)* Ellipsis? + ; + + capture + : simpleCapture + | initcapture + ; + + simpleCapture + : And? Identifier + | This + ; + + initcapture + : And? Identifier initializer + ; + + lambdaDeclarator + : LeftParen parameterDeclarationClause? RightParen Mutable? exceptionSpecification? attributeSpecifierSeq? trailingReturnType? + ; + + postfixExpression + : primaryExpression + | postfixExpression LeftBracket (expression | bracedInitList) RightBracket + | postfixExpression LeftParen expressionList? RightParen + | (simpleTypeSpecifier | typeNameSpecifier) ( + LeftParen expressionList? RightParen + | bracedInitList + ) + | postfixExpression (Dot | Arrow) (Template? idExpression | pseudoDestructorName) + | postfixExpression (PlusPlus | MinusMinus) + | (Dynamic_cast | Static_cast | Reinterpret_cast | Const_cast) Less theTypeId Greater LeftParen expression RightParen + | typeIdOfTheTypeId LeftParen (expression | theTypeId) RightParen + ; + + /* + add a middle layer to eliminate duplicated function declarations + */ + + typeIdOfTheTypeId + : Typeid_ + ; + + expressionList + : initializerList + ; + + pseudoDestructorName + : nestedNameSpecifier? (theTypeName Doublecolon)? Tilde theTypeName + | nestedNameSpecifier Template simpleTemplateId Doublecolon Tilde theTypeName + | Tilde decltypeSpecifier + ; + + unaryExpression + : postfixExpression + | (PlusPlus | MinusMinus | unaryOperator | Sizeof) unaryExpression + | Sizeof (LeftParen theTypeId RightParen | Ellipsis LeftParen Identifier RightParen) + | Alignof LeftParen theTypeId RightParen + | noExceptExpression + | newExpression_ + | deleteExpression + ; + + unaryOperator + : Or + | Star + | And + | Plus + | Tilde + | Minus + | Not + ; + + newExpression_ + : Doublecolon? New newPlacement? (newTypeId | LeftParen theTypeId RightParen) newInitializer_? + ; + + newPlacement + : LeftParen expressionList RightParen + ; + + newTypeId + : typeSpecifierSeq newDeclarator_? + ; + + newDeclarator_ + : pointerOperator newDeclarator_? + | noPointerNewDeclarator + ; + + noPointerNewDeclarator + : LeftBracket expression RightBracket attributeSpecifierSeq? + | noPointerNewDeclarator LeftBracket constantExpression RightBracket attributeSpecifierSeq? + ; + + newInitializer_ + : LeftParen expressionList? RightParen + | bracedInitList + ; + + deleteExpression + : Doublecolon? Delete (LeftBracket RightBracket)? castExpression + ; + + noExceptExpression + : Noexcept LeftParen expression RightParen + ; + + castExpression + : unaryExpression + | LeftParen theTypeId RightParen castExpression + ; + + pointerMemberExpression + : castExpression ((DotStar | ArrowStar) castExpression)* + ; + + multiplicativeExpression + : pointerMemberExpression ((Star | Div | Mod) pointerMemberExpression)* + ; + + additiveExpression + : multiplicativeExpression ((Plus | Minus) multiplicativeExpression)* + ; + + shiftExpression + : additiveExpression (shiftOperator additiveExpression)* + ; + + shiftOperator + : Greater Greater + | Less Less + ; + + relationalExpression + : shiftExpression ((Less | Greater | LessEqual | GreaterEqual) shiftExpression)* + ; + + equalityExpression + : relationalExpression ((Equal | NotEqual) relationalExpression)* + ; + + andExpression + : equalityExpression (And equalityExpression)* + ; + + exclusiveOrExpression + : andExpression (Caret andExpression)* + ; + + inclusiveOrExpression + : exclusiveOrExpression (Or exclusiveOrExpression)* + ; + + logicalAndExpression + : inclusiveOrExpression (AndAnd inclusiveOrExpression)* + ; + + logicalOrExpression + : logicalAndExpression (OrOr logicalAndExpression)* + ; + + conditionalExpression + : logicalOrExpression (Question expression Colon assignmentExpression)? + ; + + assignmentExpression + : conditionalExpression + | logicalOrExpression assignmentOperator initializerClause + | throwExpression + ; + + assignmentOperator + : Assign + | StarAssign + | DivAssign + | ModAssign + | PlusAssign + | MinusAssign + | RightShiftAssign + | LeftShiftAssign + | AndAssign + | XorAssign + | OrAssign + ; + + expression + : assignmentExpression (Comma assignmentExpression)* + ; + + constantExpression + : conditionalExpression + ; + + /*Statements*/ + + statement + : labeledStatement + | declarationStatement + | attributeSpecifierSeq? ( + expressionStatement + | compoundStatement + | selectionStatement + | iterationStatement + | jumpStatement + | tryBlock + ) + ; + + labeledStatement + : attributeSpecifierSeq? (Identifier | Case constantExpression | Default) Colon statement + ; + + expressionStatement + : expression? Semi + ; + + compoundStatement + : LeftBrace statementSeq? RightBrace + ; + + statementSeq + : statement+ + ; + + selectionStatement + : If LeftParen condition RightParen statement (Else statement)? + | Switch LeftParen condition RightParen statement + ; + + condition + : expression + | attributeSpecifierSeq? declSpecifierSeq declarator ( + Assign initializerClause + | bracedInitList + ) + ; + + iterationStatement + : While LeftParen condition RightParen statement + | Do statement While LeftParen expression RightParen Semi + | For LeftParen ( + forInitStatement condition? Semi expression? + | forRangeDeclaration Colon forRangeInitializer + ) RightParen statement + ; + + forInitStatement + : expressionStatement + | simpleDeclaration + ; + + forRangeDeclaration + : attributeSpecifierSeq? declSpecifierSeq declarator + ; + + forRangeInitializer + : expression + | bracedInitList + ; + + jumpStatement + : (Break | Continue | Return (expression | bracedInitList)? | Goto Identifier) Semi + ; + + declarationStatement + : blockDeclaration + ; + + /*Declarations*/ + + declarationseq + : declaration+ + ; + + declaration + : blockDeclaration + | functionDefinition + | templateDeclaration + | explicitInstantiation + | explicitSpecialization + | linkageSpecification + | namespaceDefinition + | emptyDeclaration_ + | attributeDeclaration + ; + + blockDeclaration + : simpleDeclaration + | asmDefinition + | namespaceAliasDefinition + | usingDeclaration + | usingDirective + | staticAssertDeclaration + | aliasDeclaration + | opaqueEnumDeclaration + ; + + aliasDeclaration + : Using Identifier attributeSpecifierSeq? Assign theTypeId Semi + ; + + simpleDeclaration + : declSpecifierSeq? initDeclaratorList? Semi + | attributeSpecifierSeq declSpecifierSeq? initDeclaratorList Semi + ; + + staticAssertDeclaration + : Static_assert LeftParen constantExpression Comma StringLiteral RightParen Semi + ; + + emptyDeclaration_ + : Semi + ; + + attributeDeclaration + : attributeSpecifierSeq Semi + ; + + declSpecifier + : storageClassSpecifier + | typeSpecifier + | functionSpecifier + | Friend + | Typedef + | Constexpr + ; + + declSpecifierSeq + : declSpecifier+? attributeSpecifierSeq? + ; + + storageClassSpecifier + : Register + | Static + | Thread_local + | Extern + | Mutable + ; + + functionSpecifier + : Inline + | Virtual + | Explicit + ; + + typedefName + : Identifier + ; + + typeSpecifier + : trailingTypeSpecifier + | classSpecifier + | enumSpecifier + ; + + trailingTypeSpecifier + : simpleTypeSpecifier + | elaboratedTypeSpecifier + | typeNameSpecifier + | cvQualifier + ; + + typeSpecifierSeq + : typeSpecifier+ attributeSpecifierSeq? + ; + + trailingTypeSpecifierSeq + : trailingTypeSpecifier+ attributeSpecifierSeq? + ; + + simpleTypeLengthModifier + : Short + | Long + ; + + simpleTypeSignednessModifier + : Unsigned + | Signed + ; + + simpleTypeSpecifier + : nestedNameSpecifier? theTypeName + | nestedNameSpecifier Template simpleTemplateId + | Char + | Char16 + | Char32 + | Wchar + | Bool + | Short + | Int + | Long + | Float + | Signed + | Unsigned + | Float + | Double + | Void + | Auto + | decltypeSpecifier + ; + + theTypeName + : className + | enumName + | typedefName + | simpleTemplateId + ; + + decltypeSpecifier + : Decltype LeftParen (expression | Auto) RightParen + ; + + elaboratedTypeSpecifier + : classKey ( + attributeSpecifierSeq? nestedNameSpecifier? Identifier + | simpleTemplateId + | nestedNameSpecifier Template? simpleTemplateId + ) + | Enum nestedNameSpecifier? Identifier + ; + + enumName + : Identifier + ; + + enumSpecifier + : enumHead LeftBrace (enumeratorList Comma?)? RightBrace + ; + + enumHead + : enumkey attributeSpecifierSeq? (nestedNameSpecifier? Identifier)? enumbase? + ; + + opaqueEnumDeclaration + : enumkey attributeSpecifierSeq? Identifier enumbase? Semi + ; + + enumkey + : Enum (Class | Struct)? + ; + + enumbase + : Colon typeSpecifierSeq + ; + + enumeratorList + : enumeratorDefinition (Comma enumeratorDefinition)* + ; + + enumeratorDefinition + : enumerator (Assign constantExpression)? + ; + + enumerator + : Identifier + ; + + namespaceName + : originalNamespaceName + | namespaceAlias + ; + + originalNamespaceName + : Identifier + ; + + namespaceDefinition + : Inline? Namespace (Identifier | originalNamespaceName)? LeftBrace namespaceBody = declarationseq? RightBrace + ; + + namespaceAlias + : Identifier + ; + + namespaceAliasDefinition + : Namespace Identifier Assign qualifiednamespacespecifier Semi + ; + + qualifiednamespacespecifier + : nestedNameSpecifier? namespaceName + ; + + usingDeclaration + : Using (Typename_? nestedNameSpecifier | Doublecolon) unqualifiedId Semi + ; + + usingDirective + : attributeSpecifierSeq? Using Namespace nestedNameSpecifier? namespaceName Semi + ; + + asmDefinition + : Asm LeftParen StringLiteral RightParen Semi + ; + + linkageSpecification + : Extern StringLiteral (LeftBrace declarationseq? RightBrace | declaration) + ; + + attributeSpecifierSeq + : attributeSpecifier+ + ; + + attributeSpecifier + : LeftBracket LeftBracket attributeList? RightBracket RightBracket + | alignmentspecifier + ; + + alignmentspecifier + : Alignas LeftParen (theTypeId | constantExpression) Ellipsis? RightParen + ; + + attributeList + : attribute (Comma attribute)* Ellipsis? + ; + + attribute + : (attributeNamespace Doublecolon)? Identifier attributeArgumentClause? + ; + + attributeNamespace + : Identifier + ; + + attributeArgumentClause + : LeftParen balancedTokenSeq? RightParen + ; + + balancedTokenSeq + : balancedtoken+ + ; + + balancedtoken + : LeftParen balancedTokenSeq RightParen + | LeftBracket balancedTokenSeq RightBracket + | LeftBrace balancedTokenSeq RightBrace + | ~(LeftParen | RightParen | LeftBrace | RightBrace | LeftBracket | RightBracket)+ + ; + + /*Declarators*/ + + initDeclaratorList + : initDeclarator (Comma initDeclarator)* + ; + + initDeclarator + : declarator initializer? + ; + + declarator + : pointerDeclarator + | noPointerDeclarator parametersAndQualifiers trailingReturnType + ; + + pointerDeclarator + : (pointerOperator Const?)* noPointerDeclarator + ; + + noPointerDeclarator + : declaratorid attributeSpecifierSeq? + | noPointerDeclarator ( + parametersAndQualifiers + | LeftBracket constantExpression? RightBracket attributeSpecifierSeq? + ) + | LeftParen pointerDeclarator RightParen + ; + + parametersAndQualifiers + : LeftParen parameterDeclarationClause? RightParen cvqualifierseq? refqualifier? exceptionSpecification? attributeSpecifierSeq? + ; + + trailingReturnType + : Arrow trailingTypeSpecifierSeq abstractDeclarator? + ; + + pointerOperator + : (And | AndAnd) attributeSpecifierSeq? + | nestedNameSpecifier? Star attributeSpecifierSeq? cvqualifierseq? + ; + + cvqualifierseq + : cvQualifier+ + ; + + cvQualifier + : Const + | Volatile + ; + + refqualifier + : And + | AndAnd + ; + + declaratorid + : Ellipsis? idExpression + ; + + theTypeId + : typeSpecifierSeq abstractDeclarator? + ; + + abstractDeclarator + : pointerAbstractDeclarator + | noPointerAbstractDeclarator? parametersAndQualifiers trailingReturnType + | abstractPackDeclarator + ; + + pointerAbstractDeclarator + : pointerOperator* (noPointerAbstractDeclarator | pointerOperator) + ; + + noPointerAbstractDeclarator + : (parametersAndQualifiers | LeftParen pointerAbstractDeclarator RightParen) ( + parametersAndQualifiers + | LeftBracket constantExpression? RightBracket attributeSpecifierSeq? + )* + ; + + abstractPackDeclarator + : pointerOperator* noPointerAbstractPackDeclarator + ; + + noPointerAbstractPackDeclarator + : Ellipsis ( + parametersAndQualifiers + | LeftBracket constantExpression? RightBracket attributeSpecifierSeq? + )* + ; + + parameterDeclarationClause + : parameterDeclarationList (Comma? Ellipsis)? + ; + + parameterDeclarationList + : parameterDeclaration (Comma parameterDeclaration)* + ; + + parameterDeclaration + : attributeSpecifierSeq? declSpecifierSeq (declarator | abstractDeclarator?) ( + Assign initializerClause + )? + ; + + functionDefinition + : attributeSpecifierSeq? declSpecifierSeq? declarator virtualSpecifierSeq? functionBody + ; + + functionBody + : constructorInitializer? compoundStatement + | functionTryBlock + | Assign (Default | Delete) Semi + ; + + initializer + : braceOrEqualInitializer + | LeftParen expressionList RightParen + ; + + braceOrEqualInitializer + : Assign initializerClause + | bracedInitList + ; + + initializerClause + : assignmentExpression + | bracedInitList + ; + + initializerList + : initializerClause Ellipsis? (Comma initializerClause Ellipsis?)* + ; + + bracedInitList + : LeftBrace (initializerList Comma?)? RightBrace + ; + + /*Classes*/ + + className + : Identifier + | simpleTemplateId + ; + + classSpecifier + : classHead LeftBrace memberSpecification? RightBrace + ; + + classHead + : classKey attributeSpecifierSeq? (classHeadName classVirtSpecifier?)? baseClause? + | Union attributeSpecifierSeq? ( classHeadName classVirtSpecifier?)? + ; + + classHeadName + : nestedNameSpecifier? className + ; + + classVirtSpecifier + : Final + ; + + classKey + : Class + | Struct + ; + + memberSpecification + : (memberdeclaration | accessSpecifier Colon)+ + ; + + memberdeclaration + : attributeSpecifierSeq? declSpecifierSeq? memberDeclaratorList? Semi + | functionDefinition + | usingDeclaration + | staticAssertDeclaration + | templateDeclaration + | aliasDeclaration + | emptyDeclaration_ + ; + + memberDeclaratorList + : memberDeclarator (Comma memberDeclarator)* + ; + + memberDeclarator + : declarator ( + virtualSpecifierSeq + | { this.IsPureSpecifierAllowed() }? pureSpecifier + | { this.IsPureSpecifierAllowed() }? virtualSpecifierSeq pureSpecifier + | braceOrEqualInitializer + ) + | declarator + | Identifier? attributeSpecifierSeq? Colon constantExpression + ; + + virtualSpecifierSeq + : virtualSpecifier+ + ; + + virtualSpecifier + : Override + | Final + ; + + /* + purespecifier: Assign '0'//Conflicts with the lexer ; + */ + + pureSpecifier + : Assign IntegerLiteral + ; + + /*Derived classes*/ + + baseClause + : Colon baseSpecifierList + ; + + baseSpecifierList + : baseSpecifier Ellipsis? (Comma baseSpecifier Ellipsis?)* + ; + + baseSpecifier + : attributeSpecifierSeq? ( + baseTypeSpecifier + | Virtual accessSpecifier? baseTypeSpecifier + | accessSpecifier Virtual? baseTypeSpecifier + ) + ; + + classOrDeclType + : nestedNameSpecifier? className + | decltypeSpecifier + ; + + baseTypeSpecifier + : classOrDeclType + ; + + accessSpecifier + : Private + | Protected + | Public + ; + + /*Special member functions*/ + + conversionFunctionId + : Operator conversionTypeId + ; + + conversionTypeId + : typeSpecifierSeq conversionDeclarator? + ; + + conversionDeclarator + : pointerOperator conversionDeclarator? + ; + + constructorInitializer + : Colon memInitializerList + ; + + memInitializerList + : memInitializer Ellipsis? (Comma memInitializer Ellipsis?)* + ; + + memInitializer + : meminitializerid (LeftParen expressionList? RightParen | bracedInitList) + ; + + meminitializerid + : classOrDeclType + | Identifier + ; + + /*Overloading*/ + + operatorFunctionId + : Operator theOperator + ; + + literalOperatorId + : Operator (StringLiteral Identifier | UserDefinedStringLiteral) + ; + + /*Templates*/ + + templateDeclaration + : Template Less templateparameterList Greater declaration + ; + + templateparameterList + : templateParameter (Comma templateParameter)* + ; + + templateParameter + : typeParameter + | parameterDeclaration + ; + + typeParameter + : ((Template Less templateparameterList Greater)? Class | Typename_) ( + Ellipsis? Identifier? + | Identifier? Assign theTypeId + ) + ; + + simpleTemplateId + : templateName Less templateArgumentList? Greater + ; + + templateId + : simpleTemplateId + | (operatorFunctionId | literalOperatorId) Less templateArgumentList? Greater + ; + + templateName + : Identifier + ; + + templateArgumentList + : templateArgument Ellipsis? (Comma templateArgument Ellipsis?)* + ; + + templateArgument + : theTypeId + | constantExpression + | idExpression + ; + + typeNameSpecifier + : Typename_ nestedNameSpecifier (Identifier | Template? simpleTemplateId) + ; + + explicitInstantiation + : Extern? Template declaration + ; + + explicitSpecialization + : Template Less Greater declaration + ; + + /*Exception handling*/ + + tryBlock + : Try compoundStatement handlerSeq + ; + + functionTryBlock + : Try constructorInitializer? compoundStatement handlerSeq + ; + + handlerSeq + : handler+ + ; + + handler + : Catch LeftParen exceptionDeclaration RightParen compoundStatement + ; + + exceptionDeclaration + : attributeSpecifierSeq? typeSpecifierSeq (declarator | abstractDeclarator)? + | Ellipsis + ; + + throwExpression + : Throw assignmentExpression? + ; + + exceptionSpecification + : dynamicExceptionSpecification + | noeExceptSpecification + ; + + dynamicExceptionSpecification + : Throw LeftParen typeIdList? RightParen + ; + + typeIdList + : theTypeId Ellipsis? (Comma theTypeId Ellipsis?)* + ; + + noeExceptSpecification + : Noexcept LeftParen constantExpression RightParen + | Noexcept + ; + + /*Preprocessing directives*/ + + /*Lexer*/ + + theOperator + : New (LeftBracket RightBracket)? + | Delete (LeftBracket RightBracket)? + | Plus + | Minus + | Star + | Div + | Mod + | Caret + | And + | Or + | Tilde + | Not + | Assign + | Greater + | Less + | GreaterEqual + | PlusAssign + | MinusAssign + | StarAssign + | ModAssign + | XorAssign + | AndAssign + | OrAssign + | Less Less + | Greater Greater + | RightShiftAssign + | LeftShiftAssign + | Equal + | NotEqual + | LessEqual + | AndAnd + | OrOr + | PlusPlus + | MinusMinus + | Comma + | ArrowStar + | Arrow + | LeftParen RightParen + | LeftBracket RightBracket + ; + + literal + : IntegerLiteral + | CharacterLiteral + | FloatingLiteral + | StringLiteral + | BooleanLiteral + | PointerLiteral + | UserDefinedLiteral + ; + + + IntegerLiteral: + DecimalLiteral Integersuffix? + | OctalLiteral Integersuffix? + | HexadecimalLiteral Integersuffix? + | BinaryLiteral Integersuffix? + ; + + CharacterLiteral: ('u' | 'U' | 'L')? '\'' Cchar+ '\''; + + FloatingLiteral: + Fractionalconstant Exponentpart? Floatingsuffix? + | Digitsequence Exponentpart Floatingsuffix? + ; + + StringLiteral: Encodingprefix? (Rawstring | '"' Schar* '"'); + + BooleanLiteral: False_ | True_; + + PointerLiteral: Nullptr; + + UserDefinedLiteral: + UserDefinedIntegerLiteral + | UserDefinedFloatingLiteral + | UserDefinedStringLiteral + | UserDefinedCharacterLiteral + ; + + MultiLineMacro: '#' (~[\n]*? '\\' '\r'? '\n')+ ~ [\n]+ -> channel (HIDDEN); + + Directive: '#' ~ [\n]* -> channel (HIDDEN); + /*Keywords*/ + + Alignas: 'alignas'; + + Alignof: 'alignof'; + + Asm: 'asm'; + + Auto: 'auto'; + + Bool: 'bool'; + + Break: 'break'; + + Case: 'case'; + + Catch: 'catch'; + + Char: 'char'; + + Char16: 'char16_t'; + + Char32: 'char32_t'; + + Class: 'class'; + + Const: 'const'; + + Constexpr: 'constexpr'; + + Const_cast: 'const_cast'; + + Continue: 'continue'; + + Decltype: 'decltype'; + + Default: 'default'; + + Delete: 'delete'; + + Do: 'do'; + + Double: 'double'; + + Dynamic_cast: 'dynamic_cast'; + + Else: 'else'; + + Enum: 'enum'; + + Explicit: 'explicit'; + + Export: 'export'; + + Extern: 'extern'; + + //DO NOT RENAME - PYTHON NEEDS True and False + False_: 'false'; + + Final: 'final'; + + Float: 'float'; + + For: 'for'; + + Friend: 'friend'; + + Goto: 'goto'; + + If: 'if'; + + Inline: 'inline'; + + Int: 'int'; + + Long: 'long'; + + Mutable: 'mutable'; + + Namespace: 'namespace'; + + New: 'new'; + + Noexcept: 'noexcept'; + + Nullptr: 'nullptr'; + + Operator: 'operator'; + + Override: 'override'; + + Private: 'private'; + + Protected: 'protected'; + + Public: 'public'; + + Register: 'register'; + + Reinterpret_cast: 'reinterpret_cast'; + + Return: 'return'; + + Short: 'short'; + + Signed: 'signed'; + + Sizeof: 'sizeof'; + + Static: 'static'; + + Static_assert: 'static_assert'; + + Static_cast: 'static_cast'; + + Struct: 'struct'; + + Switch: 'switch'; + + Template: 'template'; + + This: 'this'; + + Thread_local: 'thread_local'; + + Throw: 'throw'; + + //DO NOT RENAME - PYTHON NEEDS True and False + True_: 'true'; + + Try: 'try'; + + Typedef: 'typedef'; + + Typeid_: 'typeid'; + + Typename_: 'typename'; + + Union: 'union'; + + Unsigned: 'unsigned'; + + Using: 'using'; + + Virtual: 'virtual'; + + Void: 'void'; + + Volatile: 'volatile'; + + Wchar: 'wchar_t'; + + While: 'while'; + /*Operators*/ + + LeftParen: '('; + + RightParen: ')'; + + LeftBracket: '['; + + RightBracket: ']'; + + LeftBrace: '{'; + + RightBrace: '}'; + + Plus: '+'; + + Minus: '-'; + + Star: '*'; + + Div: '/'; + + Mod: '%'; + + Caret: '^'; + + And: '&'; + + Or: '|'; + + Tilde: '~'; + + Not: '!' | 'not'; + + Assign: '='; + + Less: '<'; + + Greater: '>'; + + PlusAssign: '+='; + + MinusAssign: '-='; + + StarAssign: '*='; + + DivAssign: '/='; + + ModAssign: '%='; + + XorAssign: '^='; + + AndAssign: '&='; + + OrAssign: '|='; + + LeftShiftAssign: '<<='; + + RightShiftAssign: '>>='; + + Equal: '=='; + + NotEqual: '!='; + + LessEqual: '<='; + + GreaterEqual: '>='; + + AndAnd: '&&' | 'and'; + + OrOr: '||' | 'or'; + + PlusPlus: '++'; + + MinusMinus: '--'; + + Comma: ','; + + ArrowStar: '->*'; + + Arrow: '->'; + + Question: '?'; + + Colon: ':'; + + Doublecolon: '::'; + + Semi: ';'; + + Dot: '.'; + + DotStar: '.*'; + + Ellipsis: '...'; + + fragment Hexquad: HEXADECIMALDIGIT HEXADECIMALDIGIT HEXADECIMALDIGIT HEXADECIMALDIGIT; + + fragment Universalcharactername: '\\u' Hexquad | '\\U' Hexquad Hexquad; + + Identifier: + /* + Identifiernondigit | Identifier Identifiernondigit | Identifier DIGIT + */ Identifiernondigit (Identifiernondigit | DIGIT)* + ; + + fragment Identifiernondigit: NONDIGIT | Universalcharactername; + + fragment NONDIGIT: [a-zA-Z_]; + + fragment DIGIT: [0-9]; + + DecimalLiteral: NONZERODIGIT ('\''? DIGIT)*; + + OctalLiteral: '0' ('\''? OCTALDIGIT)*; + + HexadecimalLiteral: ('0x' | '0X') HEXADECIMALDIGIT ( '\''? HEXADECIMALDIGIT)*; + + BinaryLiteral: ('0b' | '0B') BINARYDIGIT ('\''? BINARYDIGIT)*; + + fragment NONZERODIGIT: [1-9]; + + fragment OCTALDIGIT: [0-7]; + + fragment HEXADECIMALDIGIT: [0-9a-fA-F]; + + fragment BINARYDIGIT: [01]; + + Integersuffix: + Unsignedsuffix Longsuffix? + | Unsignedsuffix Longlongsuffix? + | Longsuffix Unsignedsuffix? + | Longlongsuffix Unsignedsuffix? + ; + + fragment Unsignedsuffix: [uU]; + + fragment Longsuffix: [lL]; + + fragment Longlongsuffix: 'll' | 'LL'; + + fragment Cchar: ~ ['\\\r\n] | Escapesequence | Universalcharactername; + + fragment Escapesequence: Simpleescapesequence | Octalescapesequence | Hexadecimalescapesequence; + + fragment Simpleescapesequence: + '\\\'' + | '\\"' + | '\\?' + | '\\\\' + | '\\a' + | '\\b' + | '\\f' + | '\\n' + | '\\r' + | '\\' ('\r' '\n'? | '\n') + | '\\t' + | '\\v' + ; + + fragment Octalescapesequence: + '\\' OCTALDIGIT + | '\\' OCTALDIGIT OCTALDIGIT + | '\\' OCTALDIGIT OCTALDIGIT OCTALDIGIT + ; + + fragment Hexadecimalescapesequence: '\\x' HEXADECIMALDIGIT+; + + fragment Fractionalconstant: Digitsequence? '.' Digitsequence | Digitsequence '.'; + + fragment Exponentpart: 'e' SIGN? Digitsequence | 'E' SIGN? Digitsequence; + + fragment SIGN: [+-]; + + fragment Digitsequence: DIGIT ('\''? DIGIT)*; + + fragment Floatingsuffix: [flFL]; + + fragment Encodingprefix: 'u8' | 'u' | 'U' | 'L'; + + fragment Schar: ~ ["\\\r\n] | Escapesequence | Universalcharactername; + + fragment Rawstring: 'R"' ( '\\' ["()] | ~[\r\n (])*? '(' ~[)]*? ')' ( '\\' ["()] | ~[\r\n "])*? '"'; + + UserDefinedIntegerLiteral: + DecimalLiteral Udsuffix + | OctalLiteral Udsuffix + | HexadecimalLiteral Udsuffix + | BinaryLiteral Udsuffix + ; + + UserDefinedFloatingLiteral: + Fractionalconstant Exponentpart? Udsuffix + | Digitsequence Exponentpart Udsuffix + ; + + UserDefinedStringLiteral: StringLiteral Udsuffix; + + UserDefinedCharacterLiteral: CharacterLiteral Udsuffix; + + fragment Udsuffix: Identifier; + + Whitespace: [ \t]+ -> skip; + + Newline: ('\r' '\n'? | '\n') -> skip; + + BlockComment: '/*' .*? '*/' -> skip; + + LineComment: '//' ~ [\r\n]* -> skip; + ``` + + 在文件夹中新建一个CPP14ParserBase.ts文件,内容如下: + + ```ts + import {Parser, Lexer, Token, TokenStream, ParserRuleContext} from "antlr4"; + import CPP14Parser from './CPP14Parser'; + import ParametersAndQualifiersContext from './CPP14Parser'; + + export default abstract class CPP14ParserBase extends Parser { + + constructor(input: TokenStream) { + super(input); + } + + protected IsPureSpecifierAllowed() : boolean { + try { + var x = this._ctx; // memberDeclarator + if (!x || !x.children) { + return false; + } + const c = (x.children[0] as ParserRuleContext)?.children?.[0] as ParserRuleContext; + if (!c || !c.children) { + return false; + } + var c2 = c.children[0] as ParserRuleContext; + if (!c2 || !c2.children) { + return false; + } + var p = c2.children[1] as ParserRuleContext; + if (p == undefined) + return false; + var r = p.constructor.name === "ParametersAndQualifiersContext"; + return r; + } catch (e) { + } + return false; + } + } + + ``` + +2. 在该语法文件所在目录下打开命令行窗口,输入以下命令生成TypeScript解析器 + + ``` + antlr4 -Dlanguage=TypeScript -listener CPP14.g4 + ``` + + 生成文件如下 + + ![image-9](.\images\image-9.png) + +3. 配置TypeScript项目,即在语法文件所在目录下输入以下命令: + + ``` + npm init -y + npm install antlr4 + npm install @types/node --save-dev + ``` + + 并在语法文件所在目录下新建一tsconfig.json文件,文件内容如下: + + ```json + { + "compilerOptions": { + "target": "ES6", + "module": "commonjs", + "strict": true, + } + } + ``` + +4. 在语法文件同级目录下新建一文件CPPListener.ts,文件内容如下: + + ```ts + import { TerminalNode, ErrorNode, ParserRuleContext } from 'antlr4'; + import CPP14Listener from './CPP14Listener'; + import { SelectionStatementContext, ClassSpecifierContext, FunctionSpecifierContext } from './CPP14Parser'; + + export class CPPListener implements CPP14Listener { + private blockDeclarations: string[] = []; + private functionDefinitions: string[] = []; + private selectionStatements: string[] = []; + private classSpecifiers: string[] = []; + + enterFunctionDefinition(ctx: FunctionDefinitionContext) { + const functionDefinition = ctx.getText(); + this.functionDefinitions.push(functionDefinition); + console.log(`[Listener] functionDefinition: ${functionDefinition}`) + } + exitFunctionDefinition(ctx: FunctionDefinitionContext) {} + + enterSelectionStatement(ctx: SelectionStatementContext) { + const selectionStatement = ctx.getText(); + this.selectionStatements.push(selectionStatement); + console.log(`[Listener] Selection statement: ${selectionStatement}`); + } + exitSelectionStatement(ctx: SelectionStatementContext) {} + + enterClassSpecifier(ctx: ClassSpecifierContext) { + const classSpecifier = ctx.getText(); + this.classSpecifiers.push(classSpecifier); + console.log(`[Listener] Class specifier: ${classSpecifier}`); + } + exitClassSpecifier(ctx: ClassSpecifierContext) {} + + visitTerminal(node: TerminalNode): void {} + + visitErrorNode(node: ErrorNode): void { + console.error(`[Listener] ${node.toString()}`); + } + + enterEveryRule(ctx: ParserRuleContext): void { + // console.log(`[Listener] Enter rule: ${ctx}`); + } + exitEveryRule(ctx: ParserRuleContext): void { + // console.log(`[Listener] Exit rule: ${ctx}`); + } + + printMessage() { + console.log(`[Listener] Parsing Complete!`); + console.log(`[Listener] Function definitions: ${this.functionDefinitions}`); + console.log(`[Listener] Selection statements: ${this.selectionStatements}`); + console.log(`[Listener] Class specifiers: ${this.classSpecifiers}`); + } + } + ``` + +5. 编写解析代码,即在语法文件所在目录下新建一index.ts文件,内容如下: diff --git a/src/intellij_plugin/ohosgen/doc/images/image-1.png b/src/intellij_plugin/ohosgen/doc/images/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9799f8324c80963780432bd8d3b2f71b35fd2e75 GIT binary patch literal 9419 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 a2;sD$ad}z?n?esM!N^D`idTsmefS@5J4o~Z literal 0 HcmV?d00001 diff --git a/src/intellij_plugin/ohosgen/doc/images/image-10.png b/src/intellij_plugin/ohosgen/doc/images/image-10.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1a3c77e9c3078529928864bb5594f21952d16e GIT binary patch literal 34816 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 AfdBvi literal 0 HcmV?d00001 diff --git a/src/intellij_plugin/ohosgen/doc/images/image-5.png b/src/intellij_plugin/ohosgen/doc/images/image-5.png new file mode 100644 index 0000000000000000000000000000000000000000..9823f425b3b5c21ca235008f2c06d7e7022c0ef8 GIT binary patch literal 14538 zcmch84Oo)*`hPpyvX*7#DYH^%?&N0W8>tHwkLF9;O!JtBGzHBUN?lfph=}~kN}Hx@ z<_juN+SJs*B(qSY(tJgkqM{X$mLP(Vq97vhf2?i4opaWH`(MB7|GzG|xE`Lz=jF@& zx$n>CbKhJ!;^(velkK0ZTD5BZSBE_Rv1-)^)4=QKn$^H3;yXAu;O&FNfB1N;BKPkU z0UIA7+z-32T6H&X-Ezdo!1mfRhk_GVt=iDG^7^1Np*m{SsxRSRdAc7>fz6bB`-2#q zUxE05KFkw6kDFfG;pz7>%A9eiyYSoPlycuyYkLZNaxkYgB%KQQ8vN0Ep2CEj@v{UAUH((5j z>CWn`xw^blGC>e$GhKEP*9$7&IbC2TGG*RvfrF0io}PY59gVn=S6}ydIaa{+HHpD9a%inBiFV0KHZJACTf#kD3T<90?88H?3J8un$5e1k{ z6FB+;AJ8|X*CdZ*Y?TZVebt1~7F9Tdq%k)7d+Ig5;&RwyxVZx*FqPIJLj|h^Z{1^v zL@pHjBPmv@edplw2?u3zYf1*|^MSKMjO>^&F8J=U5TJsS5J+cl_i&MqI_<*6)L z*gh3;S>!EdC_Q&;*UPDilhWxO{eLw`&p~zH+9ShsISeM~eUzub} zw9B5N=w>3zE)Qw9kG+0GhL72n|1g$8zU-+TG@gn~FE_u2dp1m9fs3HXPiFU@K2U8` zM;WY%n@Wl?336*l+}AM&#sr!8!fkDON`civX6_};WTvnf3jCqoq>Kd%SnpDDODwC- zQ1rTnUVIALVuwsD04vJ$#0AP;~WP z{I?Wm*Mie2q&pV2h+vBGwM^`xLU#j@ug|f{!I8Mtf_*}V&*m({xRP6m*U%m=1v=aj z%G3Fqls8mo%@m6KW4?Ps+Up?9UPht`fk=i$JBI~ygr_^cqQ?>^Yw@|K>(fIq$(q~5 z$1yZl2oyP^NZrMF=EmNIwP$p>m=nKFJ>p}qFz9TMR%Or_NV;>a-=%?SMy5)ilKI2_ z99V4{>y$183M$Bbb}Q~0I=d@R5v97q+Ar9_doG%eJ@gtyYdBpvle7zO*&e6@f_$_M z?kXYZ5u@V^ktr*gZ-$BK{Fr`hma1@8{JGHp zK63j7h@iMNOW=!WRkq|E)&2$B>%V^p@3auyfq4+K7_8VHk;pTg5G^05rU=+Lb8<^M ze^@jkRK^pv+E$I+Xu{|x_pmdQ3l!^%(JoM_ZUaQKwCC4-4>UK3Z|=aY*vc)FC^r&8 zvuCtyqeqtbl-bZ&k%N4rq(n2`bH>AbuFDjQp^b{NB>?o~NHwE+wwI=UN2Ufj|pUbose*@UezitA`QXGk+ihg-!%vuri>ZJhouAs(z!CkNhXSN0Z=M@B3NcQ zqo103tT}6G<6O-F{{@u3nzN}nv8!J{W1%e8*NH``dbxZnvoC10Ooz6lj2>KLE{#e% zg7H-z2(>UY;D{HjM~w&ig6fI2`(@OYP3SQuca*2KTv|Ong-i_CJ$J^0-r;b9xY6Uq z1ywo+6`j9Mh zbu8*zXWkwbntlWUj}3I~u`Uz>$!&}vuP5$t2t}wCKz~Uz**&JuzzsPM1T+seafVxf zYxRw|(_8EHk5>pCWGYTP;gqir*qF87ECPcHr<(NrorUsF9Mhj3Tlz@c1GdN$RfkPd zNQ=+X=4~x5ZbS`2s>h1*=?XVGKN!P`6Fc-q`67-bBUsH2k)6FU`lR5v)iJcuP)8uG z`OH}HbuK?nVqEy>O>k%h?6Cl-RiSMIZrB}c8}a81^^Z7C z#92hb$EAiIYi2Q_bMT?zXND?Ey`zZaX!~QlxJqdKfmcIDz)t6Qosom-?twUO0ct~a z0et;raH{`}oOja_h&G+ywkCA#JQ!J&*)%eJY-E%DYF$h|bk59sV3R{dCYh1k5n z^5RAkb5>VDOfzn%JB2Sg6=!n(z-PVQlxv5aqza4Cov{Tnjx*Mn-5NV{d+E}~2}9Ll zMoB<)OP+Yjp<(_LM?~4urY}3eyCLjiw}>iSgYL6Ez$u?h-GIT<1D9RMha+idll2Q- zPBr~g3k7w&PaL7=6YC-;Kvz{&zU14_a6fGE$nqcm!ELvAYMme&P7dPbqrHdmbly|2 zwDMWgD?|zXKDvKyHoH+XyaCotb~_?x^nM* zbH)(F+e7&ez`||;vyCZ*bWPh@nRPcXj~|sAf4QR%DWz=mvdvphY+5i zoUbbL9l#*o^D!TQ4kg^h9*-eMS55C?(4 ze)~QFq>QaV0GsCgf7wjiqEoSO-n5PWK6;HCCu+YuPz|l@?RF{MvTNc;y@e{b8?x4P zY&uIIlF6RC>AV!C&N7DDn2=V;IAhk{m}4-#@ICsN^{yT&q>^3=4f|%kwL-Ixm36Kf zntlso+c}rs7mly4&0w9#JP&!&uv%V=M;V5Z=`$ju&qHSOiXE_|N6aCUn|X=EAm zJAPEs5t7TOcOj!(cN&ItjU#mn&!-9(w!|68t4y*#r_NU!EcC~%mRI0^^q=!LZ*FBP zsSO>uxKG3m`{Y(vuT2(00eENqF%~5*RE@w z^WCkK2`=a8jGJobVM>~=BtYd|2+E5tE}Ep#24?JMda&du6s}ShDwb-iJUM1FMw9f8 zDZw^N>V%W(LB=!MH6{XloVruK@0A1FnAzE=3dmLYI+goTZt}+V^n6-n{0krKRo3fc zu13+SdX7S3><#c!Fe>arSEenuD@{U9b=jL&qO46@Eq?Yf=3@AZb4Q?_VL&1tYC`U3 zYB|cFK<#vF*9x8se$TcKBL_7+@kcg!2%A<@U`g z=di9Gd!P#S@Ar0UDvr7o-ZFUumW2E2NGFRIX)+?3-A#JgbTRu-nom6v7 z8q)5YO}OfwA$F~>#JrS!;^(t9u2jEU`L&7@&-(Q(=1{cn`(4NtX+~~w^5&9_o6L|$ zo^S7VX+xZu>5jP;mJop40hO9ft}G_)n<}TlhDN${{wQr6dq4M4Su{Py(^O#|yc&3J zlL-9R$0^3eO=X<#yZ9oHO1Y)_a4Kheqtw)6+e}94W7GQl%zl=1zJmX-&~J73+%@RT z-Q|8{QYtOAU?$1SI72m-qpU#}Qewcg$4h5t#ulnlSC@(a$}-&eTzq9YR`;D~xjUUu z7X1d%1Yh%d>PD_9P5R-O=-|u{BJLI_Pa??_*J198Q48!wjuk)g8DnJF_s0rHQAiYT z*Ib2baQaF@y{t^8(cZ0Rk~WHAm6<*tl4V_yk$Ts3e}*c%$LUx{OmL>Mg=K#&m-ksl z3ZJ!|rwo?6;+w+LhnvL}(r)|Fad%SRjmrStXXFAb=Rl?TRAjCw`(%HT0K-xrnzZ?; zY1#820Ubz+ZXt~$))$7^+VolkcBQD_ z%D1dPr{?}x>-}%`qLoZM51 z4dNM2t`{Kh8A@L;dQx$NnhiDLt7Kd`${9G?8X&4B>6cluc?8CfeoD8Nz!UL;v;{KR zb!np?k1blET#q9Srfc@Ff$+pXAHx;-C0q|)(Q?d|jHwbD2L~pJfSY!hG|L}18hoA2 zd?Q~YaAC?~JIGDdX%(fV=gwh!BU?py{s8Z*WY;R$DUoR*$O;Z{=}%p&HAb7%Cwf}z zYE&na%Y8zI?smDns$p6ODf@Zpl~mrC(7GlrA{{DEZ7do93Q4>5xI0&KA-lEOuXSoS zVGNRQ>R%vADyx^bCcg=b`_@*+jpDSmkOd3zW)=CHJhB3(+_|bY7I4;ov>^p{-q3ObqT75amb0NK4Oq$~Q zo$X(WUr>EATjZwa&}I-sv+TKXn#kEU;F7x6usxWy5qpE#c1u$A@NHOTL}o?Y0m@MW_ZFJ5wJo#d$+lI=Tf&zNHu*uDLb5+{dvYx z;9YUM*zuTSk8Q%Z@GRhPP+pQUO0b)v;r}GqH0*`j&D72jKToiwR1nSxwLv55d@1Tk zSVEG`>u4SuyjXbhyzt9!yGrr#qkGf3qu@wT}J1Cj%HMxWP z;(EULxT*XwYdKfp*C0NC_5Vg$UlyPO;_hRS`wSy%)F@C99n|MTHFO;;&-D@*L!*;# z(@+Wph_KKPK?Q`Z1F|%ymY#FkZ;g5KT7zk+QRuuEa?Z<1#8lwtQ)+yxUR@+88#81f zaTzMv?q*W~(t(0dZzJSv^eFQ%nC>?kJDOe0lt~&v)Gm91DiGF)8(#QM3H}>xcO}Z9 z(&wR<00_?lK#x|z{i@)nq5UL=ijW|e#`dUf%AgVKKXWw5}&;2a^rT^D}DLaFL7U2kxm`jp9vcYQ29S0v&qI0W1qL}ADVGU zod_8f<{fR_$p3orT_kyEepm^U|3xI#f0x+M9uNj9N5?FxaG-12f7f-WS|BeCWXf*BRX3xN(G*DmHr7_^8rf33a*JX*v`H ztpqF^FI=N?ttF@F-s!Dlc(mSt1CpXkg0P>;Z%YZ%J1N^&a?`m^Ac{SJlMcLi_{HAaoT@PTFQC|MyH~x2Zq0A zQerMW_;AIQiB#SsxiD9fm~@JwXt@9lTi4GYz`cD`hO^n^R=lM&5-U}Vp`=jgL3>8Y zmWd5O3Segr#mUMT&2DV6AUE!|z+VmjN*Q7)>lSm%Qq~V^B9uSYn&aVppPbdx?HnRx zZs*`T@0}u^eTEu@i=a;w#U}~zjk))#>gDN`sZD`pRLFCQ+$%47EdEC%B8O=>VGUeF z-|eV~_<05m4U6=YPu=z1|0;rds0pF>d`EZMeA;d~IQ=?$bMjR!?XdE<@hF>BwlVG_ zZ=v%}9qKfkIQ_(JH%1TTw!Ab6n60y?T&CYDgm%WiDFqkpjS*cFARcCW0kCl%UkV>Z z*ylyJAi`H)X^HP|*&7*^{yGBX2ykTuW(UORaf}f_v}QF)QrzqDofC=rg@}+$E4P{E z?5fbr6bSIxlE<@eVaQ|^D}vDe*PVdi^m~w~v%);Hft2=ZI+23tkoGO|j$GZ>#B(MS zpx=h*LZ!wsDYXg%RY6ULG^*!}&e8Us29QAT z@JA18N1vv`XJJpNSyHr8HHwX?Aup7iNB5%FUs)ztvwC*mg|ort-@5^~`;#pTh*`H8 zpYl+Y_If;t8yB8f9n`v*-k|1UA;~0sP3`mJlYnu_IPpW6uY3XpIE_-5>IeNUm51dy z?A99oRFc=TEm8DgVy`STt}%E2ETKh>zfGfIg490g!;LT$ZBwBgz(8IB$?46(0_hd| z>QbSD_x?Q7UQbXKsS_YmXSCP-+}Pir+(6GYi*83v$mrK5TM!U7=osS1oBb`fS@z6> z>my*d&}rUlK3k4#K%G&3SPO8P_ON=uq!(uGNf}yUmn0^*cvIn~6W{%-%w@hZm~Pgo z4(VL}22}BGAdY8s6wl0Kosq^e<6`$+Hl-k&-feg@^eCZ^^n|A2U1oXJk9l2p4_jWH zqN_#xmx>!~P#XC*j!Wwk=^jT{Sf3sWP@qSHhozjv!A;-JG zzo8I|PC8zgv^3chCs~A^K`|B&zmEX=yX19i;56lKU`f#xC1awrzxgvDv#IZ?DY;d>p0)b2J12ZwVUx*vBQM}20$6UE8b_tpAuA-h4SZ$ z6H*1J{j<)C>O3*C_g+^2a)`yxzCLRBRkz?s-nnWJDY}?=M-w+|d`qv9ftLtkoLYX( z!AuajNAeG(OfrK2iwW3v)FY{DtOPw9H?k=LZLm~KIthR-$*v(?c32^a;%s-&f#=$( zYYk$P4V!;2u1B7Qw=S+9#VSLt+m-uz4t2u(0m~gl+g7Eqln+QwG!&(5oxhQL8m9F2 zKdp^QM^FfOuR;-%G*_dkB|}@FvwO=it@CRN;ZelQ=m09+ysWkJZaf$ zLu?~uEX{i}61DftuAJkl0voW&l=FQ-VU$$Hgt4y_Wr=x~8PZhSFC;>q54RYJcuH_;@#8w>)5Nv9Vu{HM&6}z5 zzj`cNEos%E@960RQ#IwJ$q4Dn@5TOYZ{1%%`!)8X|5WT}eGD-h1KDHKk6E(8M^&dt z8)X83sJcFatuXPcD!@pzl3kfwEeAhai;}{l>29K}e1DDW@D;A6uk644U(Fl6+K_)T~1J6;ZDUuN(fWe zwj%f1vmRJczZs@en@FNMlwuSAu<+q1`g9%V*X*6c)lMOy$0^tj^^{jhiYXwO=(h*1 zN+GMNen&CE*H~a2lZiVVGeRa2Zv}o1Hywio19Wjwf6Cp2`_r_0*S)On<$jnmD0?p( z?=~5vhK5m6C=-cSho8giNlRPa z0E-Z+*IWK8px{WPA|#Go?(zeA^-^(O*SXOhllCj#CjBz#&~-q^j}xz%p(~+y=f%V$ zh*H4a{dejV#Hr;`9uyMP$xCSxrp0jDN>$PJYw@f(VvU(-ejn}O$GzTiXHI5_17j+R zwn&b>8Y1u#I|H4W7QU+0Cf?ZGesra@X)TY-?H-uy`gJMr+PCR#Z_aUH8;MZpRq>hV7ppmA|Gp%?ez73255tRb+$!?n;Vno?Ep{YnhXvw%iP0 znE#ZNv0Zo74crbk?M-1l(%+08D?}!^sp|oKwO@enRoApw_UvGaPg=fsh$~po-a4KJ8P>>L z%&P6&DyD0X1xI#LMhTeBmNIxt-hewclQb@O){GGY6Q1Ebs!%jk0d7)l$f}^}s?wi| zS^`!Y#L2?e_1Fy*;U8&@K*mH8Z$)VsH7D{fLozvmK(XTeH94cER3O~ML>Kdia{%*N zR^u zrPEqOE6Y2?(}6!jQRFPw!~u@`?y-3K!J)gD!+2@q$z;1RG3SOJa(+C?t*blJ`FG&w zQq(Pf+>kG^KgnFX#a;hsZhx5_?g?PzA96;Gokk3OArtC^|$0_)5LK1D)%qI=J zSk@$p+}L9aPjed9xGjMEl)XUKttAKYDIlA{V;#p}f*k>uMFm^wx%&(43ZV-ct3OTY zO4-7SIb+9+#DdFUc_pOR6Fi9bVF>}78MXqR(=Y2-$qq6vnv$Mt8e=Qgz<0mXHhlwq zfIo*QmkEo3Ar_!CC&bbGQk+|B);JV@H2 zOQmw7%=L%ppX9~@uX?|?V@|D4rHw8H38^-WM}T|UeD)7`9_s|RS)?h2nEAFXY*G7z z|2Z-`yC+#l?CKVN3S&*(Xl-M?Q4zH9tlLgAZa3M^+~yv}oaPE9SUEGy>P&L;ALjp9 zGDh!bD=pit^IWTI$-W17;Si@0x-c*un4)s#&_EW%OfFSKcg8|0)#w_n^)OS4B(}Pl zC$HF+W`2qre(7I~#J#u50r{+i*IeLJ4)nj`N|os!_hQyJ2lMQGo$Sq;vDT%a8uU=D zekx2ZUON{58qK9tls&jSe*@r zAavQ{#yW~K3F#ZoMUkIER#5c%y(l8CYc6`gGZ#xFP7g1~wmyf?7^{LfehIe@H;gS^ ztcybr^VsOS27tUbDE?1*AH>+5LXVoy~ zK!Dp&BOX$Unb|AQDN+&ZoW;{qV=cw94_c&~Xf`ZcYkA_}#hq_8lJp>)$>^i$*7O3{`nmf2 zT#V$48B0=J`GDI8K>Iw!9zggqZrgzQ$n5{r5;8h*p5>#+@gV$~l)lxR zykhCQUi+$Vo;^mMNNb6&m!uX4L}CD2K$yiZ8m%J*1+uyj0T%nN?Ir;X`GN9Ors}V#H(+m z&_7jxfL_7gj#K&Z_j%^i)ruxgmHg0TwoY#aJ9SGpK>zNIy#>!=X!(lti~v>N;pj7u z_s1Q24Gkl}ysu{`<*{C-W>#m2fIX{Yit}#dp)1FC_UeGNKP_pCAaZyIaL@8QA4-?M z7=tu(9tmp5P&#}zZ8wY6pBT7+a;^=1O_IV@9X&x9uOwwx7PuzvI~Zd7xnZWw+fLS} ze`F{$ClPOd4NROgtDzXcJwr~bkpi#nz1w??Z#8sjhA()vV-AcphKaAjvMRZvN z?=M1s(L4Y>!B4$lEBLbY;&MHrUA?z0T=grX`xopWj+(46eCp0rll7eH?ALEamy@>> z45%qpv(;~LvQhV+cnQ(*0Rq=<17I1ZXLKQg)a_C@OFVD<*<8Z`c|*=M)wN9S*zy;3 z&t=~(hJI8U2J}##Dl?R(4|`bQ=ywIjOBn*j!~afdYg{qZ3`YLYP=lBe*}_YG{$S`z zu>mJqYWNo+nQ_LyX<+=DJDf~3cs(BsxC_l3U@5y>{1-=Qn zrucLeBv~Em*pwyM$XtvUco|dFIVy+{OHnOcjCY)Ck#Yj0&_f2X3iEOBV9tBJ22yvw z+%6be=kg(z>Hn6L)Nn>;eosB|eN%w-yIC7e6W#+oM-0BYZBNKGOy+Smw8q_8FUaPX z1C$aNmH9-s>28G!Y<;78;YB*@sLHs7pJIJ&n8aBjSjBYpmUA6O9jp0>516cyt>Ckm< zG&y1N$1RnB)yP@20xJOHMw2aRfZn|}+WSAPT~*@rTYh+ZoI;Se&1w!fRn4Of^+99`iVeBW{X z0uV1&d|(R4Xar~zwO`b8P;Y#%Tb*JpflZ`(IAEqhqx!K0KnED88$mV=4MC);Y1w>` ziD6CL9R;yJd)o?{K79|G&aM~3yz0|D3uN<$m7(>Gd2kKtFtg+^JircaXl{*XEWQ_ z$=Vj?)^o$`@!ZdH$ks$|%B<(C>7R)KTn5r?s^{>g1-rf}W;Wv@&R4NP+IlMW^L9!F z|AS5Ar1h?QSmW=!g!!j?>__D1>vK{Jz|~LfEEz-1)Pb_r@b-^faTA8XuSRkYXwE&u zbBum`@CopV2xw{gj2f}KjfO-<(eoi|qFi@4mocrEk!$R{^cM2YP8wy&y1-}oU)1dh zp|%toVspRoIkvl^1W<#ODzE*Z;Y(k->n#|JGd%rTkNUM%*D#0R;x)`GB@(JQcGK|k zZPGxW`IztP8Ht7Gr47?&7qC}CH6P!9z=oSHL5?G{O(ltvx5x3L`=Wq(Dc+U02dzEK zD5jYNCA>xnY+uQTTc#dEI?0Y72vJM^N*^%haJY$wKMm=A3_9I{V>bcp(*05&2V>yVY=KaYL(WnTl z_iJdPhwo4BnpdH-m(D%2Be3R{F0@>RVms>M260at%aS~)(9oidmx1RIegRL)&)ti8 zs@^m!Oqo+P1XH3l1eJ*&_{<0le)h1(r{HRwzT)Y*p3`|Gu_EeWEssrUgLDGpcvKbx zlt<)P;fnG%xM7|ytQjA0*JRY$+HU)`8*mK`|UdrTi-rBTU@wAVwQf{;t>fWu-j2(VlJ7cyhNGFEuB> zGIUe3<3{AWVdpo*p3P~kyZ9iJ%fEBdk5RkQJ2}gIU4)BnE@M)I&Fx1Mha#Fj6x#0& zwg8geW*IQf`sI`K*=G1EsBqho{btk;u5f1Q$#=n&CA^uj)cIhpXo!VcqG5=k&qaIB zHNKmy^MpARMNk8LfXTZ@zD4om=grM1FXXq-*ewIhqed*CL1J)rxTx)fGW$j|yzn^e z)PBG)Gk%L1JI%hAwP4m;_oE%A#QJ1^5*|DY?HvM}kru!aOJexSYJpu-;t&S;l zJC9sZQA?Tl<%Sr>3%r#6xi})RIh=JdRx!lNiV08}J0^BIY>UTzME@ebwPHL~xxK;f zzIQQa*uD~NQSyAoP_}}q2H>`ry$DH2Dk>>C7#l3S%{MRc;UY$v{m43ey!9Nt5P5W^ zPbTJSsPF!N*Y05d{g}ZoV0l2?32NXYq9VVdlj+dXe;|Po_JJ}EV8tVE#{jN_8pU51 z%VWgKzLL$+B>m|6PD9mjS;|%*6wCIcM_8J0;|t}ykcts*1<+TY29@J~^eJY=v^d@b zz;8j5ecZSJ{tLpY2F+Nx?|-@O#QZvo6N3YN$>$0mlep=tOTA`>WP^m+hipx)DiG(< zv_}kFH}@L CHA8{` literal 0 HcmV?d00001 diff --git a/src/intellij_plugin/ohosgen/doc/images/image-6.png b/src/intellij_plugin/ohosgen/doc/images/image-6.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2ac3d6cd68f81e3c7ab070f3639b4e814c3a0d GIT binary patch literal 5766 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 literal 0 HcmV?d00001 diff --git a/src/intellij_plugin/ohosgen/doc/images/image-7.png b/src/intellij_plugin/ohosgen/doc/images/image-7.png new file mode 100644 index 0000000000000000000000000000000000000000..538bd5dcec91d9deec31c3a5cb6ee31611a417fd GIT binary patch literal 4067 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%0A%Xl@eg~B)#1g|ce63${aSBBoC!$r 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 be3}XWy6XNnkAQN1(2ni9y~?&7`t^SR2JAdi literal 0 HcmV?d00001 diff --git a/src/intellij_plugin/ohosgen/doc/images/image-9.png b/src/intellij_plugin/ohosgen/doc/images/image-9.png new file mode 100644 index 0000000000000000000000000000000000000000..90634294f7d72dda3f28266d97a0f04f30ad23f3 GIT binary patch literal 12945 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 Y`1Z-QRN(I;%a-l;_D58D{^{(00u@t{{{R30 literal 0 HcmV?d00001 -- Gitee From fe40eb6e92e5ccd00b6d92221443334e60c878c5 Mon Sep 17 00:00:00 2001 From: zhangmenghan Date: Thu, 27 Mar 2025 20:16:40 +0800 Subject: [PATCH 2/3] antlr4_2 Signed-off-by: zhangmenghan --- .../ohosgen/doc/Antlr4_readme.md | 111 ++++++++++++++++-- 1 file changed, 101 insertions(+), 10 deletions(-) diff --git a/src/intellij_plugin/ohosgen/doc/Antlr4_readme.md b/src/intellij_plugin/ohosgen/doc/Antlr4_readme.md index 781179e0..2412c0d4 100644 --- a/src/intellij_plugin/ohosgen/doc/Antlr4_readme.md +++ b/src/intellij_plugin/ohosgen/doc/Antlr4_readme.md @@ -32,18 +32,20 @@ ANTLR依赖Java环境,所以必须要安装JDK 1.6+,并设置好环境变量 ``` 3. 配置环境变量 - 1) 修改CLASSPATH - 打开环境变量,选择“系统变量”中的“CLASSPATH”,双击打开,如果系统变量中没有“CLASSPATH”,需新建“CLASSPATH”,在变量值中做如下添加: - ![image-1](.\images\image-1.png) - ![image-2](.\images\image-2.png) - ps:需要有一个 点(.)。 - 2)修改Path - 找到系统变量中的Path进行修改,双击打开,点击“新建”,添加C:\Users\zxj\TOOLS\ANTLR4\bat\到末尾,点击“确定”(C:\Users\zxj\TOOLS\ANTLR4为前面提到的antlr-4.13.2-complete.jar存放的文件夹)。 + + 1)修改CLASSPATH + 打开环境变量,选择“系统变量”中的“CLASSPATH”,双击打开,如果系统变量中没有“CLASSPATH”,需新建“CLASSPATH”,在变量值中做如下添加: + ![image-1](.\images\image-1.png) + ![image-2](.\images\image-2.png) + ps:需要有一个 点(.)。 + + 2)修改Path + 找到系统变量中的Path进行修改,双击打开,点击“新建”,添加C:\Users\zxj\TOOLS\ANTLR4\bat\到末尾,点击“确定”(C:\Users\zxj\TOOLS\ANTLR4为前面提到的antlr-4.13.2-complete.jar存放的文件夹)。 路径添加完毕!重启电脑让路径生效。 3. 测试下是否安装成功:在cmd中输入antlr4,回车,观察输出是否如下图。 - [![image-3](.\images\image-3.png)](https://postimg.cc/Lgp6KbD3) + ![image-3](.\images\image-3.png) 在cmd中输入grun,回车,观察输出是否如下图,如果正常的话,那到这里就说明我们的安装和配置已经成功! ![image-4](.\images\image-4.png) @@ -309,7 +311,7 @@ expr : expr '^' expr 运行ANTLR命令编译该语法文件生成词法分析器和语法分析器如下: - [![image-5](.\images\image-5.png)](https://postimg.cc/WqTjfJp9) + ![image-5](.\images\image-5.png) 3. 编译生成文件的java代码 @@ -341,7 +343,7 @@ expr : expr '^' expr 在语法文件所在目录的命令行窗口输入 `grun Hello r -gui`,按回车,然后按Ctrl+Z,再次回车,会得到 - [![image-8](.\images\image-8.png) + ![image-8](.\images\image-8.png) 还有一些其他的TestRig参数如下: @@ -1929,3 +1931,92 @@ expr : expr '^' expr ``` 5. 编写解析代码,即在语法文件所在目录下新建一index.ts文件,内容如下: + + ```ts + import { CharStreams, CommonTokenStream, ParseTreeWalker, ParseTree, RuleContext, TerminalNode } from 'antlr4'; + import CPP14Lexer from './CPP14Lexer'; + import CPP14Parser from './CPP14Parser'; + import { CPPListener } from './CPPListener'; + + function parseWithListener(content: string) { + const inputStream = CharStreams.fromString(content); + const lexer = new CPP14Lexer(inputStream); + const tokenStream = new CommonTokenStream(lexer); + const parser = new CPP14Parser(tokenStream); + const tree = parser.translationUnit(); + const listener = new CPPListener(); + const walker = new ParseTreeWalker(); + walker.walk(listener, tree); + listener.printMessage(); + + return tree; + } + + const testInput = ` + #include + #include + #include"cfi_util.h" + + class A { + public: + virtual void f(){ + printf("baseA"); + } + virtual ~A(){} + }; + + class B : public A{ + public: + void f() override{ + printf("subclassB"); + } + ~B() override{} + }; + + class C: public A{ + public: + void f() override{ + printf("subclassC"); + } + ~C() override{} + }; + + int main(){ + + if(DEBUG){ + ShowCfiLogFile(); + } + ClearCfiLog(); + if(DEBUG){ + ShowCfiLogFile(); + } + + //This test will trigger a subclass parent class conversion CFI check failure + std::shared_ptr b_ptr = std::make_shared(); + std::shared_ptr a_ptr = b_ptr; + int* a_vtable = (int*)a_ptr.get(); + printf("a_vtable: %x",*a_vtable); + std::shared_ptr c_ptr = std::static_pointer_cast(a_ptr); + FindAndCheck("'C' failed during base-to-derived cast"); + + ClearCfiLog(); + if(DEBUG){ + ShowCfiLogFile(); + } + return 0; + } + `; + + const parseTree = parseWithListener(testInput); + console.log(parseTree); + ``` + +6. 编译并运行解析器 + + ``` + npx tsc + node index.js + ``` + + 获得解析结果如下 + ![image-10](.\images\image-10.png) -- Gitee From 3921776a4fe78eecdd4a16fd07fbde54d8bcd510 Mon Sep 17 00:00:00 2001 From: zhangmenghan Date: Thu, 27 Mar 2025 20:31:19 +0800 Subject: [PATCH 3/3] antlr4_3 Signed-off-by: zhangmenghan --- src/intellij_plugin/ohosgen/doc/Antlr4_readme.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/intellij_plugin/ohosgen/doc/Antlr4_readme.md b/src/intellij_plugin/ohosgen/doc/Antlr4_readme.md index 2412c0d4..75f398e4 100644 --- a/src/intellij_plugin/ohosgen/doc/Antlr4_readme.md +++ b/src/intellij_plugin/ohosgen/doc/Antlr4_readme.md @@ -46,7 +46,7 @@ ANTLR依赖Java环境,所以必须要安装JDK 1.6+,并设置好环境变量 3. 测试下是否安装成功:在cmd中输入antlr4,回车,观察输出是否如下图。 ![image-3](.\images\image-3.png) - 在cmd中输入grun,回车,观察输出是否如下图,如果正常的话,那到这里就说明我们的安装和配置已经成功! + 在cmd中输入grun,回车,观察输出是否如下图,如果正常的话,那到这里就说明Antlr4的安装和配置已经成功! ![image-4](.\images\image-4.png) ## 三、语法文件编写 @@ -88,7 +88,7 @@ ruleN tokenVocab:导入外部词法文件(用于拆分大型语法)。 TokenLabelType:默认的是antlr的Token类型,这里可以使用自定义的token类,如MyToken。需要配合TokenFactory使用 -- **import**导入其他语法文件的规则,lexer grammer只能导入lexer grammer,parser grammer只能导入parser grammer,混合语法可以同时导入以上两者。 +- **import**导入别的语法文件的规则,lexer grammer只能导入lexer grammer,parser grammer只能导入parser grammer,混合语法可以同时导入以上两者。 - **tokens**定义虚拟Token,用于在语法树上标记节点,不用于匹配具体字符。 @@ -137,7 +137,7 @@ ruleN - 词法规则以大写字母开头,定义了如何将输入文本分解成词法单元(tokens)。词法规则使用正则表达式来定义匹配模式。 -- 语法规则以小写字母开头,规则通过组合词法单元和其他语法规则来定义语法结构,例如 +- 语法规则以小写字母开头,规则通过组合词法单元和别的语法规则来定义语法结构,例如 ``` expr : expr op=('*'|'/') expr # MulDiv @@ -234,7 +234,7 @@ expr : expr '^' expr ID : ('a'..'z'|'A'..'Z')+ ; ``` - ID规则可能和其他规则冲突,譬如其他关键字enum + ID规则可能和别的规则冲突,譬如别的关键字enum - 匹配数字 @@ -345,7 +345,7 @@ expr : expr '^' expr ![image-8](.\images\image-8.png) - 还有一些其他的TestRig参数如下: + 还有一些别的TestRig参数如下: | 选项 | 功能说明 | 示例用法 | | ------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | @@ -354,7 +354,7 @@ expr : expr '^' expr | `-trace` | 打印规则的名字以及进入和离开该规则时的词法符号,用于调试 | `grun Hello r -trace` | | `-diagnostics` | 开启解析过程中的调试信息输出,通常在输入文本有歧义等特殊情况下使用 | `grun Hello r -diagnostics` | | `-SLL` | 使用更快但受限的解析策略(默认策略为 `LL(*)`) | `grun Hello r -SLL` | - | `input-filename(s)` | 输入测试文本文件名,从控制台输入时忽略此参数 | `grun Hello r -gui aa.txt`(aa.txt是同级目录下的测试文本文件) | + | `input-filename(s)` | 输入测试文本文件名,从控制台输入时忽略此参数 | `grun Hello r -gui test.txt`(test.txt是同级目录下的测试文本文件) | ## 五、进阶版示例 -- Gitee