मैं स्वत: जनरेट पार्सर वर्ग ANTLR4 में एक इंटरफ़ेस को लागू कैसे कर सकता हूँ?

वोट
4

मैं एक पार्सर बनाने के लिए ANTLR 4 का उपयोग कर रहा है, और मैं अपने व्याकरण पूरा कर लिया है। मैं जिसके परिणामस्वरूप पार्सर फ़ाइल है कि मेरे लिए ANTLR ऑटो उत्पन्न में कुछ जावा कोड इंजेक्षन की जरूरत है।

मैं जिसके परिणामस्वरूप पार्सर में एक विधि शामिल करना चाहते हैं, मैं ANTLR व्याकरण को यह जोड़ सकते हैं:

@parser::members
{
  @Override
  public CGrammarParser.CSnippetContext call()
  {
    return cSnippet();
  }
}

मैं कुछ आयात बयान शामिल करना चाहते हैं, मैं व्याकरण को यह जोड़ सकते हैं:

@header
{
  import java.lang.Thread;
  import java.lang.InterruptedException;
  import java.util.concurrent.Callable;
}

मैं कक्षा घोषणा संशोधित करने के लिए चाहते हैं, तो इतना है कि यह एक अंतरफलक को लागू करता है , मुझे लगता है कि कैसे करते हो? दूसरे शब्दों में, यह है कि क्या ANTLR ऑटो उत्पन्न करता है:

public class CGrammarParser extends Parser 
{
  ...
}

लेकिन यह है कि क्या मैं इसे उत्पन्न करने के लिए चाहते हैं:

public class CGrammarParser extends Parser implements Callable<CGrammarParser.CSnippetContext> 
{
  ...
}
08/01/2016 को 13:13
उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
2

नहीं, आप का वर्णन (इंटरफेस (रों) के माध्यम से) की तरह नहीं। हालांकि, अगर आप एक सुपर वर्ग अपने पार्सर से विस्तार करना चाहिए परिभाषित कर सकते हैं। इस सुपर वर्ग चाहिए, बेशक, ANTLR के विस्तार Parserवर्ग। अपनी खुद की (सार) पार्सर वर्ग में, आप तो इंटरफेस आप लागू करना चाहते हैं परिभाषित करते हैं।

यहाँ है कि कैसे काम कर सकता है:

CallableParser

import java.util.concurrent.Callable;
import org.antlr.v4.runtime.Parser;
import org.antlr.v4.runtime.TokenStream;

public abstract class CallableParser extends Parser implements Callable<CGrammarParser.CSnippetContext>
{
    public CallableParser(TokenStream input)
    {
        super(input);
    }
}

CGrammar.g4

grammar CGrammar;

options
{
  superClass = CallableParser;
}

@header
{
  import java.lang.Thread;
  import java.lang.InterruptedException;
  import java.util.concurrent.Callable;
}

@parser::members
{
  @Override
  public CGrammarParser.CSnippetContext call()
  {
    return cSnippet();
  }
}

cSnippet
 : ANY*? EOF
 ;

ANY
 : .
 ;
08/01/2016 को 13:49
का स्रोत उपयोगकर्ता

वोट
0

इस उत्तर के लिए क्रेडिट को जाता है लुकास Trzesniewski

अपने ANTLR पार्सर एक इंटरफ़ेस को लागू करवाने के लिए, कोई जावा व्याकरण फ़ाइल (.g4) अपने आप में आवश्यक है। सीधे शब्दों में निम्न कार्य करें:

1) एक प्रतिदेय पार्सर वर्ग कि ANTLR पार्सर प्रदान करता है और की तरह कुछ सवाल में इंटरफ़ेस को लागू करता है, बनाएँ:

public class CallableParser extends CGrammarParser implements Callable<CGrammarParser.CSnippetContext>
{
    public CallableParser(TokenStream input)
    {
        super(input);
    }

    @Override
    public CGrammarParser.CSnippetContext call()
    {
        return cSnippet();
    }
}

2) इसके बजाय अपने ANTLR पार्सर बुलाने की, फोन CallableParserके बजाय, इस तरह:

CharStream in = new ANTLRInputStream(input);
CGrammarLexer lexer = new CGrammarLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
// Instead of doing this...
// CGrammarParser parser = new CGrammarParser(tokens);
// Do this...
CallableParser parser = new CallableParser(tokens);
23/06/2016 को 10:28
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more