2014-09-21 73 views
0

當前,我的向量的語法就像它的數字,字符串,向量和標識符的集合。在ANTLR4中匹配相同的標記類型

vector: 
    '[' elements+=vector_members? (vector_delimiters elements+=vector_members)* ']' 
; 

vector_delimiters 
: 
    ',' 
; 

vector_members: 
    NUMBER 
    | STRING 
    | vector 
    | ID 
; 

現在,有一種方法,通過語法來執行,使得載體可含有相同的數字或字符串等特定類型的唯一的元素

回答

3

當然,還有一種方法,但沒有按這不是一個好主意:

vector 
    : '[' ']' 
    | '[' elements+=NUMBER (vector_delimiters elements+=NUMBER)* ']' 
    | '[' elements+=STRING (vector_delimiters elements+=STRING)* ']' 
    | '[' elements+=ID  (vector_delimiters elements+=ID)*  ']' 
    | '[' elements+=vector (vector_delimiters elements+=vector)* ']' 
    ; 

看,這很醜。

這種驗證不應該是語法的一部分。建立一個訪問者來檢查你的一致性規則。代碼將更簡單,更易於維護,並且會尊重關注點分離原則。讓解析器進行解析,並在稍後階段進行驗證。作爲獎勵,您將能夠提供比意外令牌更好的錯誤消息。

作爲一個方面說明,您的初始語法將接受像這樣的結構:[ , 42 ]。你vector規則應該寧可:

vector 
    : '[' ']' 
    | '[' elements+=vector_members (vector_delimiters elements+=vector_members)* ']' 
    ; 
+2

你是絕對正確以爲這是個壞主意,但是你提供的代碼並沒有真正執行,所有的元素都具有相同的類型,除非標識符有自己獨特的類型(這將是非常不尋常的)。要做到這一點,你需要以某種方式區分不同類型的ID,單靠語法規則我​​認爲這是不可能的。 – sepp2k 2014-09-21 21:04:50

+0

@ sepp2k好點。這是在另一個步驟中驗證的另一個理由。 – 2014-09-21 22:10:12