亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

以 Go 為目標匹配 ANTLR4 中任何可打印的類字母字符

以 Go 為目標匹配 ANTLR4 中任何可打印的類字母字符

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

1 回答

?
catspeake

TA貢獻1111條經驗 獲得超0個贊

您可以通過引入一個詞法模式來解決這個問題,只要您匹配一個EQ記號,您就會進入該詞法模式。一旦進入該詞法模式,您要么匹配一個(,)要么匹配一個空格(在這種情況下您會跳出詞法模式),或者繼續匹配您的NOT_SPECIAL字符。

通過使用詞法模式,您必須在自己的文件中定義詞法分析器和解析器規則。請務必使用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()]+

? ?;

您的解析器語法將像這樣開始:


parser grammar MdbParser;


options {

? ? tokenVocab=MdbLexer;

}


start

?: searchclause EOF

?;


// your other parser rules

我的 Go 有點生疏,但是一個小的 Java 測試:


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

}

打印以下內容:


ID? ? ? ? ? ? ? Person

ID? ? ? ? ? ? ? Address

EQ? ? ? ? ? ? ? =

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

OPAR? ? ? ? ? ? (

CPAR? ? ? ? ? ? )

EOF? ? ? ? ? ? ?<EOF>


查看完整回答
反對 回復 2023-06-01
  • 1 回答
  • 0 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號