Git Product home page Git Product logo

Comments (9)

sharwell avatar sharwell commented on May 18, 2024

One solution that "works" is rewriting the ifStmt rule to:

ifStmt : 'if' ID stmt ('else' stmt | {_input.LA(1) != ELSE}?);
ELSE : 'else';

Unfortunately this solution has substantial drawbacks:

  1. The predicate is always evaluated, which means it could have unintended consequences if the keyword else is used in allowed in other contexts. To work properly, the predicate would need to only be used for disambiguating alternatives 1 and 2.
  2. The grammar becomes tied to a particular target language.

from antlr4.

parrt avatar parrt commented on May 18, 2024

need to add this to execATN and execDFA to make it work. is it worth complexity?

// IF PREDS, MIGHT RESOLVE TO SINGLE ALT => SLL (or syntax error)
if ( D.configs.hasSemanticContext ) {
    int nalts = decState.getNumberOfTransitions();
    // Update DFA so reach becomes accept state with (predicate,alt)
    // pairs if preds found for conflicting alts
    BitSet altsToCollectPredsFrom = getConflictingAltsOrUniqueAlt(D.configs);
    SemanticContext[] altToPred = getPredsForAmbigAlts(altsToCollectPredsFrom, D.configs, nalts);
    if ( altToPred!=null ) {
        List<DFAState.PredPrediction> predicates =
            getPredicatePredictions(altsToCollectPredsFrom, altToPred);
        input.seek(startIndex);
        BitSet alts = evalSemanticContext(predicates, outerContext, true);
        if ( alts.cardinality()==1 ) {
            System.out.println("Full LL avoided");
            return alts.nextSetBit(0);
        }
    }
}

and

// IF PREDS, MIGHT RESOLVE TO SINGLE ALT => SLL (or syntax error)
if ( s.predicates!=null ) {
    System.out.println("DFA state has preds in DFA sim LL failover");
    input.seek(startIndex);
    BitSet alts = evalSemanticContext(s.predicates, outerContext, true);
    if ( alts.cardinality()==1 ) {
        System.out.println("Full LL avoided");
        return alts.nextSetBit(0);
    }
}

only 2 failovers to full avoided in execATN for entire parse of JavaLRParser.java, none in execDFA

from antlr4.

sharwell avatar sharwell commented on May 18, 2024

I was able to simplify the change through a basic refactoring (extract method), and submitted pull request parrt#126 to full address this.

from antlr4.

sharwell avatar sharwell commented on May 18, 2024

Pull request #124 introduces an sll block option which is a much cleaner solution to this issue. Rather than use a predicate, the following rule may be used:

ifStmt : 'if' ID stmt (options{sll=true;} : 'else' stmt | );
ELSE : 'else';

from antlr4.

gkudva avatar gkudva commented on May 18, 2024

Hi,
I have a grammar with if/elseif/else statements (C# code generation), and I've run into an issue whereby a deeply nested if/else block (24 levels deep) that parses successfully in ANTLR 4.0 (albeit very slowly), now hangs on ANTLR 4.6.1 - it ran for over 2 hours without completing before I killed it. While trying to debug this issue, I ran across this thread and tried the sll = true option. However, the parsers generated with and without the sll=true option are identical. Is this option supported for C# code generation?

from antlr4.

ericvergnaud avatar ericvergnaud commented on May 18, 2024

from antlr4.

parrt avatar parrt commented on May 18, 2024

try 4.7?

from antlr4.

gkudva avatar gkudva commented on May 18, 2024

OK, will post to google groups - thanks.

@parrt - Latest NuGet package for code-generator is 4.6.1 so figured I'd use 4.6.1 for runtime as well to be in sync. Also ANTLR Runtime 4.6.1 package was later dated 5/30/2017 than ANTLR Standard Runtime 4.7.1 published on 5/28/2017. Will try 4.7.1 and see if it works.

from antlr4.

sharwell avatar sharwell commented on May 18, 2024

@gkudva The NuGet package (4.6.1) you referred to is part of a different repository. For issues with that (bugs or anything else) you should file an issue on GitHub here: https://github.com/tunnelvisionlabs/antlr4cs/

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.