2017-10-28 22 views
0

我是javacc新手。我試圖定義一個可以匹配任何字符串的令牌。我遵循正在工作的正則表達式語法<ANY: (~[])+>。我想實現的東西很簡單,定義出具有表達以下BNF:定義令牌以匹配任何字符串

<exp> ::= "path(" <string> "," <number> ")" 

我目前的.jj文件如下,我如何能解析字符串任何幫助:

options 
{ 
} 
PARSER_BEGIN(SimpleAdd) 
package SimpleAddTest; 
public class SimpleAdd 
{ 
} 
PARSER_END(SimpleAdd) 
SKIP : 
{ 
    " " 
| "\r" 
| "\t" 
| "\n" 
} 
TOKEN: 
{ 
    < NUMBER: (["0"-"9"])+ > | 
    <PATH: "path"> | 
    <RPAR: "("> | 
    <LPAR: ")"> | 
    <QUOTE: "'"> | 
    <COMMA: ","> | 
    <ANY: (~[])+> 


} 

int expr(): 
{ 
    String leftValue ; 
    int rightValue ; 
} 
{ 

     <PATH> <RPAR> <QUOTE> leftValue = str() <QUOTE> <COMMA> rightValue = num() <LPAR> 
    { return 0; } 
} 

String str(): 
{ 
    Token t; 
} 
{ 

    t = <ANY> { return t.toString(); } 
} 

int num(): 
{ 
    Token t; 
} 
{ 
    t = <NUMBER> { return Integer.parseInt(t.toString()); } 
} 

的錯誤我上述的JavaCC文件得到的是:

Exception in thread "main" SimpleAddTest.ParseException: Encountered " <ANY> "path(\'5\',1) "" at line 1, column 1. 
Was expecting: 
    "path" ... 

回答

2

模式<ANY: (~[])+>的確會匹配任何非空字符串。問題是這不是你真正想要的。如果你有一個規則<ANY: (~[])+>,它將匹配整個文件,除非該文件是空的。在大多數情況下,由於匹配規則最長,整個文件將被解析爲[ANY, EOF]。那真的是你想要的嗎?可能不會。

所以我要猜測你真正想要什麼。我猜你想要任何不包含雙引號字符的字符串。也許還有其他的限制,比如沒有非打印字符。如果前面有一個反斜槓,你可能想要允許雙引號。誰知道?根據需要調整。

這是你可以做的。首先,

TOKEN: 
{ 
    < NUMBER: (["0"-"9"])+ > | 
    <PATH: "path"> | 
    <RPAR: "("> | 
    <LPAR: ")"> | 
    <COMMA: ","> | 
    <STRING: "\"" (~["\""])* "\"" > 
} 

然後改變你的語法來

int expr(): 
{ 
    String leftValue ; 
    int rightValue ; 
} 
{  
     <PATH> <RPAR> leftValue=str() <COMMA> rightValue = num() <LPAR> 
    { return 0; } 
} 

String str(): 
{ 
    Token t; 
    int len ; 
} 
{  
    t = <String> 
    { len = t.image.length() ; } 
    { return t.image.substring(1,len-1); } 
} 
+0

是的,就是這樣,感謝您的幫助更換令牌的定義,實際上是什麼呢t.image中的回報? – Noor

+0

這是匹配字符的字符串。 –