gpt4 book ai didi

go - 在ANTLR中创建强制 token

转载 作者:行者123 更新时间:2023-12-01 20:25:55 25 4
gpt4 key购买 nike

我只是进入ANTLR。我正在尝试创建一个简单的Hello World ANTLR。我的目标是使“Hello world”成为必需的字符串。因此,我期望输入“Hello”被视为无效,并且给我一个错误,表明它期望使用“世界” token 。
编辑:请注意,我确实希望“hello”和“world”是单独的标记(将它们视为关键字),以便我可以轻松地分别识别它们。
我有以下helloworld.g4:

grammar helloworld;

WHITESPACE: [ \r\n\t]+ -> skip;
HELLO : 'Hello' ;
WORLD : 'world' ;

start : HELLO WORLD EOF ;
我有以下main.go:
package main

import (
"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'
我想知道如何做才能为我提供输出,说明“world”是“hello”之后的预期标记。它不应该期望另一个“Hello”,它应该期望“world”,然后是EOF。

最佳答案

在词法分析器中,您定义了2个单独的标记,因此词法分析器在输入"Hello"时没有问题。
如果该hello-token应该始终跟随"world",那么您必须在 token 中包括该 token :

HELLO : 'Hello' ' '+ 'world';
如果调用解析器规则 start,将导致错误。通常,这是强制 WORLD token (在解析器中)而不是在词法分析器中存在的方法。
编辑
您正在消耗所有 token ,然后将此“消耗的词法分析器”提供给解析器。跳过 token 的打印,或在打印 token 后重新初始化词法分析器。
应该这样做:
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())
}

关于go - 在ANTLR中创建强制 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63171684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com