我正在使用基於語言實現模式書中Cymbol語法的自己的語言應用程序。我一直在使用ANTLRworks開發我的語法,然後使用Eclipse實現Java中的完整應用程序。由於我的語法的一部分,我有這兩個規則:我的ANTLR3樹語法永遠不匹配一個特定的模式,它非常類似於匹配的模式
varDeclaration
: 'var' ID 'is' dataType (':=' expr)? ';'
-> ^('var' ^(NAME ID) ^(VARTYPE dataType) ^(VALUE expr)?)
;
constantDeclaration
: 'const' ID 'is' dataType ':=' expr ';'
-> ^('const' ^(NAME ID) ^(VARTYPE dataType) ^(VALUE expr))
;
運行解析器和打印生成的AST後,輸出爲這兩個出現的是正確的。
然後我運行一個符號定義樹匹配器(帶有filter-true)來構建一個符號表。除了輸入每個功能/塊/等。開始新的範圍,我還處理在自上而下規則變量和常量的定義(再次,基於語言實現模式的書),如下圖所示:
topdown
: varDeclaration
| constDeclaration
| ...
;
varDeclaration
: ^('var' ^(NAME ID) .*) //^(VAR ^(NAME ID) .*) Rewrote this for clarity of example
{
System.out.println("In a variable declaration");
}
;
constDeclaration
: ^('const' ^(NAME ID) .*)
{
System.out.println("Const definition");
}
;
我的問題是,只有constDeclaration匹配。即使我在我的輸入中有varDeclaration(經過AST打印輸出驗證),我從不會在控制檯上看到「在變量聲明中」,而「Const definition」顯示出來。
我已經試過無數的東西來調試/解決此問題:
- 所作的變量聲明不是可選的可選初始化表達式,所以它是除了關鍵字的語法等同於常量聲明。
- 將關鍵字'var'更改爲其他內容(在本例中爲'splunge')。
- 更改匹配參數以使用特定的通配符(例如。^(VAR vn = .vt = .vv =。))
- 試圖將varDeclaration放在自下而上的規則中。
正如你所看到的,我變得非常絕望,因爲我不知道爲什麼一個規則和模式匹配,另一個不匹配。變量聲明和常量聲明之間唯一的區別在於常量聲明可能發生在代碼塊和頂層(對於全局常量),而變量只能在代碼塊中聲明。我不明白爲什麼一個代碼塊中的const會被匹配,當一個var不會的時候會有什麼影響。
這個代碼是什麼錯誤匹配的例子:
function foo(int a) returns (int) {
const PI is real := 3.14159; // Recognized
var r is real; // Not recognized
var s is int := 4; // Not recognized
const TESTCONST is int := 3; // Recognized
// Other code (if statements, for loops) recognized.
}
我一直在努力,現在解決這個問題的好幾天了,但我在我束手無策。我錯過了什麼?
附加信息(添加的2013年3月20)
爲了進一步澄清,輸入聲明如
const y is real := 2.4; // Recognized
var temp is int := 0 ; // Not recognized
產生在AST以下:
(const (NAME y) (VARTYPE (SCALAR (NAME (TYPEID real)))) (VALUE (EXPR 2.4)))
(var (NAME temp) (VARTYPE (SCALAR (NAME (TYPEID int)))) (VALUE (EXPR 0)))
的常量AST由上面的樹語法匹配,var AST不是。
我假設'';'在上面的語法是一個剪切/粘貼錯誤,原來的語法實際上包含'';'? – 2013-03-19 19:25:55
你是對的---我在工作休息期間發佈了這個內容,在那裏我只有一個我通過電子郵件發送給自己的語法副本,並且在進行換行時必須刪除最後的報價。謝謝。 – 2013-03-19 21:50:58