我正在试图弄清楚,为什么当触发每个规则而不是特定规则时,我的监听者不触发规则.我在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
]