2010-10-15 13 views
5

मैं जोANTLR3 lexer पूर्वता

a..b  // [1] 
c .. x // [2] 
1..2  // [3] 
3 .. 4 // [4] 

तो, मैं जोड़ लिया है की तरह स्ट्रिंग एक साथ भाव लिए इस्तेमाल किया जाएगा ANTLR3 lexer में '..' से एक टोकन बनाना चाहते हैं,

DOTDOTSEP : '..' 
      ; 

समस्या है मैं पहले से ही एक नियम है कि:

FLOAT : INT (('.' INT (('e'|'E') INT)? 'f'?) | (('e'|'E') INT)? ('f')) 
     ; 

और उदाहरण में [3] 1..2 मैं ऊपर FLOAT के रूप में मेल खा रहा है (मुझे यकीन नहीं है कि पहले . का पालन करने के बाद से एक और . एक आईएनटी नहीं है, लेकिन यह है)।

मुझे आश्चर्य है कि लेक्सर नियमों की प्राथमिकता को बदलने का कोई तरीका है, इसलिए DOTDOTSEP पहले मिलान किया जाता है और फिर FLOAT

देख रहे हैं here ऐसा लगता है कि मैं "The rule having the greatest count is the winner.", पर हार रहा हूं लेकिन आश्चर्य है कि इसके आसपास कोई रास्ता है या नहीं।

पीएस INT नीचे के रूप में परिभाषित किया गया है ...

fragment DIGIT 
    : '0'..'9' 
    ; 

INT : DIGIT+ 
    ; 

संपादित करें। थोड़ा और परीक्षण मुझे लगता है कि यह काफी आसान नहीं है क्योंकि यह सीधे FLOAT नियम से मेल खाता है। (मैं सवाल बदलने जा रहा था, लेकिन अब मुझे जवाब मिल गया है, मैं नहीं करूँगा।) समस्या (मुझे विश्वास है) अभी भी लेक्सर नियमों की प्राथमिकता में निहित है, इसलिए प्रश्न अभी भी वही बना हुआ है।

उत्तर

7

क्या आपने http://sds.sourceforge.net/src/antlr/doc/lexer.html पर देखा था?

fragment 
INT : DIGIT+ 
    ; 

fragment 
RANGE : INT DOTDOTSEP INT 
     ; 

fragment 
FLOAT : INT (('.' INT (('e'|'E') INT)? 'f'?) | (('e'|'E') INT)? ('f')) 
     ; 

NUMBER 
    : (INT '.') => FLOAT  { $type=FLOAT; } 
    | (INT DOTDOTSEP) => RANGE { $type=RANGE; } 
    | INT      { $type=INT; } 
    ; 
+0

मुझे हो रही है यही कारण है कि बहुत करीब है, बस एक छोटे से अधिक फेरबदल की जरूरत:

सम्भावित समाधान निम्नलिखित परिभाषित करने के लिए है। वह लिंक जो मुझे नहीं मिला था लेकिन यह बहुत अच्छा लग रहा है; बस मुझे जिस चीज को पढ़ना चाहिए, इसलिए मैं अब ऐसा करने के लिए बंद हूं। धन्यवाद। – tjm

+0

मुझे अब यह अच्छी तरह से चल रहा है, बस किसी और के लिए कुछ नोट्स जो इसके द्वारा आ सकते हैं। एएनटीएलआरवर्क्स v1.4 में, दुभाषिया भविष्यवाणियों से निपट नहीं सकता है, ऐसा लगता है कि वहां त्रुटियां हैं (जब मुझे थोड़ा धीमा कर दिया गया है) और मुझे '$ settype (TYPE) बदलना पड़ा;' ' $ प्रकार = प्रकार; ' – tjm

+0

@tjm, मैंने थोड़ा एएनटीएलआर नमूना संपादित किया। क्या यह अब v3 संगत है? –

संबंधित मुद्दे