我正在嘗試創建一個 JavaCC 決議器,但我遇到了一個問題。
我想回傳文本中括號之間的所有內容,但這些括號之間的字串可能包含一些。
例如,我有這一行 :
Node(new MB34(MB78, MB654) => (MB7, M9))并且我想要一個等于 的字串"new MB34(MB78, MB654) => (MB7, M9)"。括號之間沒有特定的模式。
我嘗試根據 javacc 檔案使用詞法狀態:
SKIP :
{ " " | "\t" | "\n" | "\r" | "\f" | "\r\n" }
TOKEN :
{
< #LETTER : ( [ "a"-"z" ] | [ "A"-"Z" ] ) >
| < #DIGIT : [ "0"-"9" ] >
| < #ALPHA : ( < LETTER > | < DIGIT > ) >
| < IDENTIFIER : < LETTER > ( < ALPHA > )* >
}
TOKEN : {
< "(" > : IN_LABEL
}
< IN_LABEL > TOKEN : {
< TEXT_LABEL : ~[] >
}
< IN_LABEL > TOKEN : {
< END_LABEL : ")"> : DEFAULT
}
String LABEL():
{
Token token_label;
String label = "";
}
{
< IDENTIFIER >
"(" ( token_label = < TEXT_LABEL > { label = token_label.toString(); } ) < END_LABEL >
{
return label;
}
}
但是,由于要脫離詞法狀態“IN_LABEL”的字串是單個字符“)”,因此它不起作用,決議器匹配所有文本而不回傳默認狀態。我找到了一個臨時解決方案,將 END_LABEL 令牌替換為:
< IN_LABEL > TOKEN : {
< END_LABEL : ~[]")"> : DEFAULT
}
但它也不起作用,因為這個標記可以在標簽的真正結束之前匹配。
有沒有人可以解決這個問題?
uj5u.com熱心網友回復:
可能有一個更簡單的解決方案,但這是我的:
SKIP :
{ " " | "\t" | "\n" | "\r" | "\f" | "\r\n" }
TOKEN :
{
< #LETTER : ( [ "a"-"z" ] | [ "A"-"Z" ] ) >
| < #DIGIT : [ "0"-"9" ] >
| < #ALPHA : ( < LETTER > | < DIGIT > ) >
| < IDENTIFIER : < LETTER > ( < ALPHA > )* >
}
TOKEN_MGR_DECLS :
{
int parLevel;
}
MORE : {
"(" : IN_LABEL
}
< IN_LABEL > TOKEN : {
< TEXT_LABEL: ")" > {
matchedToken.image = image.substring(1,image.length()-1);
} : DEFAULT
}
< IN_LABEL > MORE : {
<~["(", ")"]>
}
< IN_LABEL > MORE : {
"(" {parLevel = 0;} : IN_LABEL1
}
< IN_LABEL1 > MORE : {
"(" { parLevel;}
}
< IN_LABEL1 > MORE : {
")" {
if (0 == parLevel--) {
SwitchTo(IN_LABEL);
}
}
}
< IN_LABEL1 > MORE : {
<~["(", ")"]>
}
String LABEL():
{
String label = "";
}
{
< IDENTIFIER >
label = < TEXT_LABEL >.image
{
return label;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/484546.html
下一篇:如何使用Selenium和Python抓取GooglePeopleAlsoAsk的問題和答案,以獲得超過Google默認輸出的數量?
