第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 ANTLR 中創(chuàng)建強(qiáng)制令牌

在 ANTLR 中創(chuàng)建強(qiáng)制令牌

Go
猛跑小豬 2022-06-21 10:49:26
我剛剛進(jìn)入ANTLR。我正在嘗試創(chuàng)建一個簡單的 hello world ANTLR。我的目標(biāo)是使“Hello world”成為強(qiáng)制性字符串。因此,我期望“Hello”的輸入被認(rèn)為是無效的,并且它給了我一個錯誤,說明它需要一個“世界”令牌。編輯:請注意,我確實(shí)希望“hello”和“world”成為單獨(dú)的標(biāo)記(將它們視為關(guān)鍵字),以便我可以輕松地分別識別它們。我有以下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())}我正在構(gòu)建一個 Go 解析器,并使用以下命令測試結(jié)果:antlr -Dlanguage=Go -o parser helloworld.g4 && go run main.go哪個輸出:HELLO ("Hello")line 1:5 mismatched input '<EOF>' expecting 'Hello'我想知道我能做些什么來給我一個輸出,說明“世界”是“你好”之后的預(yù)期標(biāo)記。它不應(yīng)該期待另一個“Hello”,它應(yīng)該期待“world”,然后是一個 EOF。
查看完整描述

1 回答

?
UYOU

TA貢獻(xiàn)1878條經(jīng)驗(yàn) 獲得超4個贊

在詞法分析器中,您定義了 2 個單獨(dú)的標(biāo)記,因此詞法分析器對 input 沒有問題"Hello"。


如果該 hello-token 應(yīng)始終跟在 之后"world",則必須將其包含在令牌中:


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

如果您調(diào)用解析器規(guī)則start,則會導(dǎo)致錯誤。這通常是強(qiáng)制WORLD令牌存在的方式(在解析器中),而不是在詞法分析器中。


編輯

您正在使用所有令牌,然后將此“使用的詞法分析器”提供給解析器。跳過標(biāo)記的打印,或在打印標(biāo)記后重新初始化詞法分析器。


這應(yīng)該這樣做:


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())

}


查看完整回答
反對 回復(fù) 2022-06-21
  • 1 回答
  • 0 關(guān)注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號