2017-11-18 61 views
1

使用ANTLR 3,我的詞法有規則詞法規則可選後綴不匹配,當它應該使用這種這些匹配正確</p> <pre><code>SELECT VAR1 ASSIGN TO SELECT VAR1 ASSIGN USING </code></pre> <p>匹配

SELECT_ASSIGN:  
'SELECT' WS+ IDENTIFIER WS+ 'ASSIGN' WS+ (('TO'|'USING') WS+)? 

,這也符合

SELECT VAR1 ASSIGN FOO 

但是這不符合

SELECT VAR1 ASSIGN TWO 

鑑於我在標準中將TO | USING標記爲可選項。

從生成的Java代碼,我看到了 當詞法分析器注意到的兩個T,它會匹配(「至」) 但由於沒有找到ØT後 然後生成失敗....返回所有從規則的方式 - 因此不匹配。

如何讓我的詞法規則來匹配,當輸入了單詞以字符開始與規則

基本上,我想我的規則是爲了匹配這個(什麼它已經匹配旁邊的後綴可選部分 - 如lised在開始):

SELECT VAR1 ASSIGN TWO 

請建議我如何接近/解決這種情況。

注:

這些規則建議在解析器 - 但我有這個在詞法分析器 - 因爲我不想來解析解析器整個輸入,並且要分析的興趣只是內容。因此,在詞法分析器中使用這些規則,我找到了我真正想要解析器解析的部分。


更新1 我可以做2條規則繞過這個問題,像這樣:

SELECT_ASSIGN_USING_TO 
: tok='SELECT' WS+ name=IDENTIFIER WS+ 'ASSIGN' WS+ ('USING'|'TO') 

SELECT_ASSIGN 
: tok='SELECT' WS+ name=IDENTIFIER WS+ 'ASSIGN' 

但它是可以做到所期望的一個詞法規則?

+0

請提供一個簡單但完整的詞法分析器語法來完成此操作(a [mcve]) - 問題可能出現在另一個詞法分析器規則中。 –

回答

0

的方法來獲得這一個規則,通過我的高級建議 - 使用語法謂詞

SELECT_ASSIGN 
: tok='SELECT' WS+ name=IDENTIFIER WS+ 'ASSIGN' 
    (
     (WS+ ('TO'|'USING') WS+)=> (WS+ ('TO'|'USING') WS+) 
     | (WS+) 
    ) 
0

令牌匹配一個完整的字符序列或無。它無法部分匹配,語法規則決定了它的確切位置。你不能指望TO的規則匹配TWO。如果您想要TWO也匹配,則必須將其添加到詞法分析器規則中。

這裏的幾個注意事項:

  1. 該解決方案的「前輩」給你毫無意義可言。 A 句法謂詞在萬案的情況下是指導解析器的有點前瞻性。這裏沒有涉及到的任何形式。
  2. 書寫 作爲詞法分析規則的整個SELECT_ASSIGN規則是非常罕見的,並且不靈活。詞法分析器規則不應該用於整個句子,而是僅用於一小組字符以找到用於分配它們的標記 一種類型(通常是諸如string,,,comment等等的語言的基本結構)。
  3. ANTLR3已經完全過時了,我想知道爲什麼你的班級仍然使用它。 ANTLR4已有5年的歷史,應該是任何新項目的選擇。
+0

我不希望「TO的規則」與TWO匹配。 我說的是這樣的: 我期望詞法分析器規則至少匹配輸入「SELECT VAR1 ASSIGN TWO」的前3個單詞 - 因爲在規則的末尾使用TO | USING是可選的。 – vikramsjn

+0

不過,我的答案適用。詞法分析規則完全匹配或根本不匹配。如果您已將SELECT_ASSIGN規則編寫爲解析器規則,則情況會發生變化。對於解析器規則,原理也適用於它完全匹配或根本不匹配,但是當您將規則分成若干部分時,生成的分析樹將至少包含那些匹配的部分(取決於規則的結構)。 –

相關問題