@@ -156,27 +156,38 @@ console.log(tokens)
156156
157157使用 Visitor 模式访问 AST 中的指定节点
158158
159- ``` javascript
160- import { MySQL , MySqlParserVisitor } from ' dt-sql-parser' ;
159+ ``` typescript
160+ import { MySQL , AbstractParseTreeVisitor } from ' dt-sql-parser' ;
161+ import type { MySqlParserVisitor } from ' dt-sql-parser' ;
161162
162- const parser = new MySQL ()
163- const sql = ` select id,name from user1;`
164- // parseTree
165- const tree = parser .parse (sql)
166- class MyVisitor extends MySqlParserVisitor {
167- // 重写 visitTableName 方法
163+ const parser = new MySQL ();
164+ const sql = ` select id,name from user1; ` ;
165+ const tree = parser .parse (sql );
166+
167+ type Result = string ;
168+
169+ class MyVisitor extends AbstractParseTreeVisitor <Result > implements MySqlParserVisitor <Result > {
170+ protected defaultResult() {
171+ return ' ' ;
172+ }
168173 visitTableName(ctx ) {
169- let tableName = ctx .getText ().toLowerCase ()
170- console .log (' TableName' , tableName)
174+ let tableName = ctx .text .toLowerCase ();
175+ console .log (' TableName' , tableName );
176+ return ' ' ;
171177 }
172- // 重写 visitSelectElements 方法
173178 visitSelectElements(ctx ) {
174- let selectElements = ctx .getText ().toLowerCase ()
175- console .log (' SelectElements' , selectElements)
179+ let selectElements = ctx .text .toLowerCase ();
180+ console .log (' SelectElements' , selectElements );
181+ return ' ' ;
182+ }
183+ visitProgram(ctx ) {
184+ return ' Return by program node'
176185 }
177186}
178- const visitor = new MyVisitor ()
179- visitor .visit (tree)
187+ const visitor = new MyVisitor ();
188+ const result = visitor .visit (tree );
189+
190+ console .log (result );
180191```
181192
182193* 输出:*
@@ -186,6 +197,9 @@ visitor.visit(tree)
186197SelectElements id,name
187198TableName user1
188199*/
200+ /*
201+ Return by program node
202+ */
189203```
190204
191205> 提示:使用 Visitor 模式时,节点的方法名称可以在对应 SQL 目录下的 Visitor 文件中查找
@@ -194,25 +208,26 @@ TableName user1
194208
195209Listener 模式,利用 [ ANTLR4] ( https://github.com/antlr/antlr4 ) 提供的 ` ParseTreeWalker ` 对象遍历 AST,进入各个节点时调用对应的方法。
196210
197- ``` javascript
198- import { MySQL , MySqlParserListener } from ' dt-sql-parser' ;
211+ ``` typescript
212+ import { MySQL } from ' dt-sql-parser' ;
213+ import type { MySqlParserListener } from ' dt-sql-parser' ;
199214
200215const parser = new MySQL ();
201- const sql = ' select id,name from user1;'
202- // parseTree
203- const tree = parser . parse (sql)
204- class MyListener extends MySqlParserListener {
216+ const sql = ' select id,name from user1;' ;
217+ const parseTree = parser . parse ( sql );
218+
219+ class MyListener implements MySqlParserListener {
205220 enterTableName(ctx ) {
206- let tableName = ctx .getText () .toLowerCase ()
207- console .log (' TableName' , tableName)
221+ let tableName = ctx .text .toLowerCase ();
222+ console .log (' TableName: ' , tableName );
208223 }
209224 enterSelectElements(ctx ) {
210- let selectElements = ctx .getText () .toLowerCase ()
211- log (' SelectElements' , selectElements)
225+ let selectElements = ctx .text .toLowerCase ();
226+ console . log (' SelectElements: ' , selectElements );
212227 }
213228}
214229const listenTableName = new MyListener ();
215- parser .listen (listenTableName, tree );
230+ parser .listen (listenTableName as MySqlParserListener , parseTree );
216231```
217232
218233* 输出:*
0 commit comments