我正在试图弄清楚,为什么当触发每个规则而不是特定规则时,我的监听者不触发规则.我在http://lab.antlr.org/分钟测试了我的语法作品

谢谢.

这张照片...

func (f *FSLListener) EnterEveryRule(ctx antlr.ParserRuleContext) {
    fmt.Printf("EnterEveryRule %v\n", ctx.GetText())
}

但这并不是

func (f *FSLListener) ExitVar_assignment(ctx *parser.Var_assignmentContext) error {
    fmt.Printf("Complete var assignment: %s\n", ctx.GetText())
    // ... updated this line to reflect that I was handling this error which is why I didn't see any compiler errors
    return nil 
}

遵循https://github.com/antlr/antlr4/blob/master/doc/go-target.md中的示例监听程序

我的语法是

parser grammar fslParser;

options { tokenVocab=fsl词法分析器; }


r: script* EOF;

script: var_assignment* init_function function_definition*;

var_assignment: VAR VALUE;
init_function: INIT cmd_list RBRACK;
function_definition: VALIDFUNCTIONID cmd_list RBRACK;

cmd_list: (cmd_expression)*;

cmd_expression:
  CMD FUNCTIONCALL
  | CMD FUNCTIONCALLWITHARGS param_list //function call
  | CMD VARREF COMMA param_list // variable reference
  | CMD builtin_functions param_list // user-defined function call
;

builtin_functions: (CREATE | DELETE | UPDATE | ADD | SUBTRACT | MULTIPLY | DIVIDE | PRINT);

param_list: ARG param (COMMA ARG param)*;
param:
  VARREF
  | VALUE
  | LETTERS VALUE
  | VARPARAM
  | VARPARAM VALUE
;

词法分析器

lexer grammar fsl词法分析器;

INIT : 'init: [' ;
VALIDFUNCTIONID : [a-zA-Z]+ ': [';
VAR : 'var' [0-9]+':' ;
VALUE : [0-9]+ ('.' [0-9]+)? ;
CMD : 'cmd:' ;
VARREF : '#var'[0-9]+ ;
FUNCTIONCALL : '#' [a-zA-Z]+ ;
FUNCTIONCALLWITHARGS : '#' [a-zA-Z]+',' ;
VARPARAM : '$' [a-zA-Z]+ ;

DIGITS: [0-9]+;
LETTERS: [a-zA-Z]+;

ARG: LETTERS DIGITS? COLON;

// Define function names as keywords
CREATE  : 'create,' ;
DELETE  : 'delete,' ;
UPDATE  : 'update,' ;
ADD     : 'add,' ;
SUBTRACT: 'subtract,' ;
MULTIPLY: 'multiply,' ;
DIVIDE  : 'divide,' ;
PRINT   : 'print,' ;

COLON : ':';
COMMA : ',';
RBRACK : ']';

SPACE : [ \t\r\n]+ -> skip ;

我正在try 匹配的示例输入:

var1: 1
var2: 2

init: [
    cmd: #setup
]

setup: [
    cmd: #sum, id: var1, value1: #var1, value2: #var2
    cmd: #printAll
]

sum: [
   cmd: add, id: $id, operand1: $value1, operand2: $value2
]

printAll: [
   cmd: print, value: #var1
   cmd: print, value: #var2
   cmd: print, value: #var3
]

推荐答案

func (f *FSLListener) ExitVar_assignment(ctx *parser.Var_assignmentContext) error {
    fmt.Printf("Complete var assignment: %s\n", ctx.GetText())
}

应该是:

func (f *FSLListener) ExitVar_assignment(ctx *parser.Var_assignmentContext) {
    fmt.Printf("Complete var assignment: %s\n", ctx.GetText())
}

这是GO代码中的一个简单语法错误.该实现没有返回值.应用此更改后,我可以看到以下输出:

Complete var assignment: var1:1
Complete var assignment: var2:2

请注意,生成的fslParserListener接口为:

// fslParserListener is a complete listener for a parse tree produced by fslParser.
type fslParserListener interface {
    // ExitVar_assignment is called when exiting the var_assignment production.
    ExitVar_assignment(c *Var_assignmentContext)

    // Other codes truncated
}

它没有返回值.

要强制接口遵从性,您可以导出侦听器接口并将以下语句添加到代码中(它假设接口导出为parser.FslParserListener):

var _ parser.FslParserListener = (*FSLListener)(nil)

Go相关问答推荐

如何从google.golang.org/grpc/stats包中将golang中不同事件的输出进行组合,以获取func HandlePRC

Zitadel示例Go Webapp加密密钥

为什么工具链指令在这种情况下没有效果?

生成一个 CSV/Excel,在 Golang 中该列的下拉选项中指定值

如何在 Go msgraph-sdk-go 中转发消息并包括抄送和/或密送收件人?

Secrets Manager Update Secret - Secret String 额外的 JSON 编码

为什么 net/http 不遵守超过 30 秒的超时持续时间?

无法使用带有 422 的 go-github 创建提交 - 更新不是快进

自定义 Fyne 自适应网格布局

Golang:如何判断通过缓冲通道进行通信时生产者或消费者是否较慢?

如何处理 Go 的 firebase admin sdk 错误?

在 Go 模板中对照片使用随机 Int

如何在 Docker 容器中使用私有存储库进行身份验证

在 Golang 中,如何将接口作为泛型类型与 nil 进行比较?

如何使用 Go 获取 X11 中的窗口列表

为什么时间很短.睡眠时间比基准测试中要求的(约 300 ns)长?

GoReleaser 和 ssh-agent Github 操作:为什么无法读取用户名...终端提示已禁用?

Golang:每个键具有多个值的映射

Go 1.18 泛型如何使用接口定义新的类型参数

Go 语言的select语句