2013-08-07 11 views
9

के साथ एक स्ट्रिंग को प्रोसेस करना मैं अपने व्याकरण को v3 से v4 में बदलने की कोशिश कर रहा हूं और सभी सही टुकड़ों को ढूंढने में कुछ परेशानी है।एएनटीएलआर 4

एक स्ट्रिंग को संसाधित करने v3 में, मैं प्रयोग किया है:

public static DataExtractor create(String dataspec) { 
    CharStream stream = new ANTLRStringStream(dataspec); 
    DataSpecificationLexer lexer = new DataSpecificationLexer(stream); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    DataSpecificationParser parser = new DataSpecificationParser(tokens); 

    return parser.dataspec(); 
} 

मैं कैसे बदल सकता हूँ इस v4 में काम करने के लिए?

उत्तर

13

किए गए परिवर्तनों को कर रहे हैं:

  • ANTLRStringStreamANTLRInputStream में एक निर्माता है कि एक String
  • पार्सर नियम अब एक संदर्भ वस्तु जो नाम के एक सार्वजनिक क्षेत्र है लौटने returns के अनुसार लेता है के साथ प्रतिस्थापित किया गया है आपके नियम की धारा।

तो dataspec नियम कहता है "returns [DataExtractor extractor]", v4 विधि हो जाता है:

public static DataExtractor create(String dataspec) { 
    CharStream stream = new ANTLRInputStream(dataspec); 
    DataSpecificationLexer lexer = new DataSpecificationLexer(stream); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    DataSpecificationParser parser = new DataSpecificationParser(tokens); 

    return parser.dataspec().extractor; 
} 
10

ANTLR 4.7 एपीआई के लिए एक छोटे से (ANTLRInputStream हटाई गई है) में बदल गया था:

InputStream stream = new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8)); 
lexer.setInputStream(CharStreams.fromStream(stream, StandardCharsets.UTF_8)); 
parser.setInputStream(new CommonTokenStream(lexer)); 

संकेत: यदि आप पार्सर + लेक्सर उदाहरणों का दोबारा उपयोग करना चाहते हैं, तो अपनी इनपुट स्ट्रीम सेट करने के बाद 'रीसेट()' विधियों को कॉल करें।

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