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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

以 Go 為目標(biāo)匹配 ANTLR4 中任何可打印的類字母字符

以 Go 為目標(biāo)匹配 ANTLR4 中任何可打印的類字母字符

Go
偶然的你 2023-06-01 14:27:39
這把我嚇壞了,我就是找不到解決辦法。我有一個(gè)搜索查詢的語(yǔ)法,并且想匹配由可打印字母組成的查詢中的任何搜索詞,特殊字符“(”,“)”除外。引號(hào)中的字符串被單獨(dú)處理并起作用。問(wèn)題是 searchterm 太受限制了。它應(yīng)該匹配注釋掉的 NOT_SPECIAL 中的任何字符,即,有效查詢將是:Person Name=% Person Address=^%Street%%%$^&*@^但是每當(dāng)我嘗試以任何方式將 NOT_SPECIAL 放入 searchterm 的定義中時(shí),它都不起作用。我也嘗試過(guò)將它逐字地放入規(guī)則中(注釋掉 NOT_SPECIAL)和許多其他東西,但它就是行不通。在我的大多數(shù)嘗試中,語(yǔ)法只是抱怨“=”之后的無(wú)關(guān)輸入,并表示它期待 EOF。但我也不能將 EOF 放入 NOT_SPECIAL。有什么方法可以簡(jiǎn)單地解析規(guī)則字段搜索中“=”之后的每個(gè)文本,直到出現(xiàn)空格或“)”、“(”?注意 STRING 規(guī)則工作正常,但用戶不應(yīng)該每次都使用引號(hào),因?yàn)檫@是一個(gè)命令行工具,他們需要轉(zhuǎn)義。目標(biāo)語(yǔ)言是圍棋。
查看完整描述

1 回答

?
catspeake

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個(gè)贊

您可以通過(guò)引入一個(gè)詞法模式來(lái)解決這個(gè)問(wèn)題,只要您匹配一個(gè)EQ記號(hào),您就會(huì)進(jìn)入該詞法模式。一旦進(jìn)入該詞法模式,您要么匹配一個(gè)(,)要么匹配一個(gè)空格(在這種情況下您會(huì)跳出詞法模式),或者繼續(xù)匹配您的NOT_SPECIAL字符。

通過(guò)使用詞法模式,您必須在自己的文件中定義詞法分析器和解析器規(guī)則。請(qǐng)務(wù)必使用lexer grammar ...andparser grammar ...而不是grammar ...您在組合.g4文件中使用的。

快速演示:

lexer grammar MdbLexer;


STRING

?: '"' ~[\r\n"]* '"'

?;


OPAR

?: '('

?;


CPAR

?: ')'

?;


AND

?: 'and'

?;


OR

?: 'or'

?;


NOT

?: 'not'

?;


NO

?: 'no'

?;


EVERY

?: 'every'

?;


EQ

?: '=' -> pushMode(NOT_SPECIAL_MODE)

?;


ID

?: VALID_ID_START VALID_ID_CHAR*

?;


DIGIT

?: [0-9]

?;


WS

?: [ \r\n\t]+ -> skip

?;


fragment VALID_ID_START

?: [a-zA-Z_]

?;


fragment VALID_ID_CHAR

?: [a-zA-Z_0-9]

?;


mode NOT_SPECIAL_MODE;


? OPAR2

? ?: '(' -> type(OPAR), popMode

? ?;


? CPAR2

? ?: ')' -> type(CPAR), popMode

? ?;


? WS2

? ?: [ \t\r\n] -> skip, popMode

? ?;


? NOT_SPECIAL

? ?: ~[ \t\r\n()]+

? ?;

您的解析器語(yǔ)法將像這樣開(kāi)始:


parser grammar MdbParser;


options {

? ? tokenVocab=MdbLexer;

}


start

?: searchclause EOF

?;


// your other parser rules

我的 Go 有點(diǎn)生疏,但是一個(gè)小的 Java 測(cè)試:


String source = "Person Address=^%Street%%%$^&*@^()";


MdbLexer lexer = new MdbLexer(CharStreams.fromString(source));


CommonTokenStream tokens = new CommonTokenStream(lexer);

tokens.fill();


for (Token t : tokens.getTokens()) {

? System.out.printf("%-15s %s\n", MdbLexer.VOCABULARY.getSymbolicName(t.getType()), t.getText());

}

打印以下內(nèi)容:


ID? ? ? ? ? ? ? Person

ID? ? ? ? ? ? ? Address

EQ? ? ? ? ? ? ? =

NOT_SPECIAL? ? ?^%Street%%%$^&*@^

OPAR? ? ? ? ? ? (

CPAR? ? ? ? ? ? )

EOF? ? ? ? ? ? ?<EOF>


查看完整回答
反對(duì) 回復(fù) 2023-06-01
  • 1 回答
  • 0 關(guān)注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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