Code Monkey home page Code Monkey logo

Comments (4)

jasonf20 avatar jasonf20 commented on July 17, 2024 2

Since this issue is from 2012 I'm wondering if there is any alternative to this that has been implemented (since this issue is still open)?

Does @sharwell 's branch resolve this? Is there any chance of merging that?

from antlr4.

sharwell avatar sharwell commented on July 17, 2024

A few comments:

  • createSContext is probably a better name since it's creating a new SContext as opposed to a new S.
  • A general createContext rule like the following would be useful for implementing a parser interpretation mode.
  • For createContext to be useful, an action dispatch method like the one used in generated lexers will be necessary for executing user-specified actions. An additional method returning an Object will be necessary for evaluating arguments to pass as necessary.
  • To prevent unnecessary boxing/unboxing overhead in standard parsing, argument evaluation can be inlined like it is now. Action evaluation would not suffer from the same problem, and as long as the generated ruleName_action methods are declared final the performance impact of dispatching the call would likely be negligible.
public ParserRuleContext<Token> createContext(int ruleIndex,
                                              int outerAlt,
                                              ParserRuleContext<Token> parent,
                                              int state,
                                              Object[] args) {
    switch (ruleIndex) {
    case RULE_s:
        assert outerAlt == 0 : "Shouldn't recreate context for unlabeled alternatives.";
        return createSContext(parent, state);
    case RULE_e:
        assert outerAlt >= 0 && outerAlt <= 3 : "Invalid alternative.";
        assert outerAlt == 0 || parent != null : "Parent must be specified for labeled alternatives.";
        switch (outerAlt) {
        case 0:
            return createEContext(parent, state, (int)args[0]);
        case 1:
            return createMultContext((EContext)parent);
        case 2:
            return createAddContext((EContext)parent);
        case 3:
            return createIntContext((EContext)parent);
        default:
            break;
        }
        break;
    }

    throw new IllegalArgumentException(String.format("Cannot create context for invalid rule/alt combination %d/%d.", ruleIndex, outerAlt));
}

from antlr4.

JFinis avatar JFinis commented on July 17, 2024

I strongly support a factory as it allows to use other allocation mechanisms. In addition to contexts, the factory should also be used to create lists for multi valued tokens. I.e. in a rule

x : (xs+=x)*

the list xs in the XContext class should be created by a factory method instead of a hardcoded new ArrayList<...>(); this would allow to replace list implementation or even recycle some lists which are no longer needed.

@sharwell: I do not see why such generic createContext method is necessary. Can you elaborate that.

from antlr4.

sharwell avatar sharwell commented on July 17, 2024

There are a number of constructs which are hard-coded into the generated rule methods which currently make it impossible to build an "interpreter mode" parser. In order to build an interpreter, it will be necessary to have a delegating method for context creation and action execution which can be called from inside the interpreter with simply a rule index and an alt number (context creation) or action index (action execution).

from antlr4.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.