为了账号安全,请及时绑定邮箱和手机立即绑定

在 ANTLR 中创建强制令牌

在 ANTLR 中创建强制令牌

Go
猛跑小猪 2022-06-21 10:49:26
我刚刚进入ANTLR。我正在尝试创建一个简单的 hello world ANTLR。我的目标是使“Hello world”成为强制性字符串。因此,我期望“Hello”的输入被认为是无效的,并且它给了我一个错误,说明它需要一个“世界”令牌。编辑:请注意,我确实希望“hello”和“world”成为单独的标记(将它们视为关键字),以便我可以轻松地分别识别它们。我有以下helloworld.g4:grammar helloworld;WHITESPACE: [ \r\n\t]+ -> skip;HELLO : 'Hello' ;WORLD : 'world' ;start : HELLO WORLD EOF ;我有以下 main.go:package mainimport (    "fmt"    "test/parser"    "github.com/antlr/antlr4/runtime/Go/antlr")const rule = `Hello`type testListener struct {    *parser.BasehelloworldListener}func main() {    // Setup the input    is := antlr.NewInputStream(rule)    // Create the Lexer    lexer := parser.NewhelloworldLexer(is)    // Read all tokens    for {        t := lexer.NextToken()        if t.GetTokenType() == antlr.TokenEOF {            break        }        fmt.Printf("%s (%q)\n",            lexer.SymbolicNames[t.GetTokenType()],            t.GetText())    }    // Finally parse the expression    stream := antlr.NewCommonTokenStream(lexer,        antlr.TokenDefaultChannel)    // Create the Parser    p := parser.NewhelloworldParser(stream)    // Finally parse the expression    antlr.ParseTreeWalkerDefault.Walk(&testListener{}, p.Start())}我正在构建一个 Go 解析器,并使用以下命令测试结果:antlr -Dlanguage=Go -o parser helloworld.g4 && go run main.go哪个输出:HELLO ("Hello")line 1:5 mismatched input '<EOF>' expecting 'Hello'我想知道我能做些什么来给我一个输出,说明“世界”是“你好”之后的预期标记。它不应该期待另一个“Hello”,它应该期待“world”,然后是一个 EOF。
查看完整描述

1 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

在词法分析器中,您定义了 2 个单独的标记,因此词法分析器对 input 没有问题"Hello"。


如果该 hello-token 应始终跟在 之后"world",则必须将其包含在令牌中:


HELLO : 'Hello' ' '+ 'world';

如果您调用解析器规则start,则会导致错误。这通常是强制WORLD令牌存在的方式(在解析器中),而不是在词法分析器中。


编辑

您正在使用所有令牌,然后将此“使用的词法分析器”提供给解析器。跳过标记的打印,或在打印标记后重新初始化词法分析器。


这应该这样做:


func main() {

    is := antlr.NewInputStream(`Hello`)


    lexer := parser.NewhelloworldLexer(is)


    stream := antlr.NewCommonTokenStream(lexer,

        antlr.TokenDefaultChannel)


    p := parser.NewhelloworldParser(stream)


    antlr.ParseTreeWalkerDefault.Walk(&testListener{}, p.Start())

}


查看完整回答
反对 回复 2022-06-21
  • 1 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信