2016-08-19 63 views
0

我定義的語法規則一樣我需要使用包含單引號的JavaCC的解析字符串作爲

TOKEN : { < SINGLE_QUOTE : " ' " > } 

TOKEN : { < STRING_LITERAL : " ' " (~["\n","\r"])* " ' "> 

字符串的一部分,但我不能夠解析序列像「re'd」。我所需要的解析器將re'd解析爲字符串文本。但解析器分別對這些規則解析're'和'd'。

回答

1

下面應該工作:

TOKEN : { < SINGLE_QUOTE : "'" > } 
TOKEN : { < STRING_LITERAL : "'" (~["\n","\r"])* "'"> } 

這是一個很值得你有什麼,但我刪除了一些空間。

現在,如果一行上有兩個撇號(即沒有插入換行符或返回值),那麼這些撇號的第一個和最後一個以及所有之間的字符應當作爲一個STRING_LITERAL標記進行簡化。這包括所有中間的撇號。這是假設沒有其他規則涉及撇號。例如,如果您的文件是're'd',應該將其作爲一個令牌;同樣'abc' + 'def'應該lex作爲一個令牌。

+0

感謝answer.I得到它working.But上述表達式不允許反斜槓(\\)作爲string.How的最後一個字符我可以修改表達式允許反斜槓作爲字符串中的最後一個字符? –

+0

的確,STRING_LITERAL的最後一個字符不能是反斜槓。最後一個字符必須是撇號。與第一個字符相同。但是,反斜槓可能發生在除第一個和最後一個位置以外的任何位置。例如''\''與STRING_LITERAL匹配。你有沒有理由另有想法? –

1

如果需要LEX re'd作爲STRING_LITERAL令牌,然後使用以下規則

TOKEN : { < SINGLE_QUOTE : "'" > } 
TOKEN : { < STRING_LITERAL : "'"? (~["\n","\r"])* "'"?> 

我沒有看到規則匹配「重」分開。

在javacc中,定義你的詞彙規格STRING_LITERAL是以"'"單引號開頭。但是你的輸入在開始時沒有"'"

STRING_LITERAL中添加的"?"使單個「可選」和如果僅存在一個。所以這將匹配您的輸入和lex,如STRING_LITERAL

JavaCC的決策規則:

1)的JavaCC將驗看最長匹配。 在這種情況下,即使輸入以"'"開頭,可能的匹配項爲SINGLE_QUOTESTRING_LITERAL。第二個輸入字符告訴選擇哪個令牌STRING_LITERAL。

2.)JavaCC採用在語法中首先聲明的規則。 這裏如果輸入僅爲"'"那麼即使存在可能的兩個匹配SINGLE_QUOTESTRING_LITERAL,它也將被排成SINGLE_QUOTE

希望這將幫助你...