2013-04-04 10 views
10

ANTLR4'ü öğreniyorum ve sözlüksel modlarla çalmaya çalışıyordum. Aynı belirteci birden çok sözcüksel modda nasıl görüntüleyebilirim? Çok basit bir örnek olarak, dilbilgisinin iki modu olduğunu ve beyaz alanı ve satır sonu satırlarını her ikisinde eşlemek istiyorum. Örneğin WS_MODE1 ve WS_MODE2 ile bitmeden nasıl yapabilirim? Her iki durumda da aynı tanımı yeniden kullanmanın bir yolu var mı? Moddan bağımsız olarak tüm beyaz alan için çıkış akımında WS jetonları almayı umuyordum. Aynısı, EOL ve her iki modda görünebilen diğer anahtar kelimeler için geçerlidir.ANTLR4'te çoklu sözcük modlarında görünebilen belirtiler nasıl tanımlanır?

cevap

12

Kuralların farklı adları olması gerekir, ancak aynı tür vermek için -> type(...) lexer komutunu kullanabilirsiniz.

WS : [ \t]+; 

mode Mode1; 

    Mode1_WS : WS -> type(WS); 

mode Mode2; 

    Mode2_WS : WS -> type(WS); 

olsa Mode1_WS ve Mode2_WSfragment kurallar değildir, kod üreteci type komutunu göreceksiniz ve onların türlerini yeniden biliyoruz, bu yüzden onlar için belirteçleri tanımlamak olmayacaktır.

+0

Bu Lexer kurallarının kullanımıyla ilgili kısa soru: ayrıştırıcı kurallarında WS veya Mode1_WS, Mode2_WS? İkisini de denedim ama sadece Lexer kurallarını doğrudan ayrıştırıcı kurallarına göndermeden tanımlarsınız. Bu senelerde, bir 'takma addan çok' bir ithalat ifadesi 'var. –

+0

'type' komutu, ayrıştırıcının göreceği tür olan belirteç türünü açıkça atar. Bu durumda, bu 3 kuralın herhangi biri tarafından oluşturulan simgeleri referans almak için "WS" kullanılır. –

+0

@SamHarwell son mod spesifikasyonunu ne sonlandırır? Bazı lexer doc'lerin, parça kullanımının parçalarını varsayılanları da dahil olmak üzere tüm modlarda kullanabildiğini gösterdiği son mod özelliğinin ardından parça def'leri olduğunu fark ettim. – bvj

İlgili konular