Próbuję śledzić ścieżkę realizacji wdrożenia AntLR Gościa, ponieważ wykonywanie przepływów z programu użytkownika do mojej przesłanej klasy gości (myhelloviSizytor), która dziedziczy z klasy bazowej (HellobaseviSitor).

O ile mogę powiedzieć, klasa nadpisywania (myhelloviSizytor) musi zawierają metodę zastępczą dla co najmniej górnej reguły gramatyki (o nazwie "Toprule" w mojej gramatyce).

P1. Czy klasa nadpisania (myhelloviSiSitor) zawsze zawiera metodę nadpisania do regulacji gramatyki?

P2. Czy klasa nadpisywania (myhelloviSizytor) zawsze zawiera metodę nadpisania dla reguły w gramatyce i klasie bazowej? Czy może mi zalegać pojedynczą metodę zainteresowania? Dziękuję Ci.

Oto kod dla programu użytkownika, który wywołuje myhellovizytora (moja nadrzędna klasa odwiedzin):

  // create a visitor and walk the parse tree, collecting errors or results
  var visitor = new MyHelloVisitor(); // inherits generic abstract n virtual methods
  var ctx = Parser.toprule(); // this returns a context for the top rule
  visitor.Visit(ctx);

Gdy metoda .Visit z klasy bazowej (pokazana poniżej) jest wykonywana przez myhellovizytor, operacja odlewania się powiedzie, a metoda Dlatego uważam, że klasa nadrzędna (myhelloviSiSiSitor) musi , zawiera co najmniej metodę nadpisania dla "Toprule" w gramatyce.


    public virtual Result Visit([NotNull] IParseTree tree) =>    
     tree.Accept<Result>((IParseTreeVisitor<Result>) this);
      ....


    public partial class TopruleContext : ParserRuleContext {
        public override TResult Accept<TResult>(IParseTreeVisitor<TResult> visitor) {
            IHelloVisitor<TResult> typedVisitor = visitor as IHelloVisitor<TResult>;
            if (typedVisitor != null) return typedVisitor.VisitToprule(this);
            else return visitor.VisitChildren(this);
        }
    }
0
Kevin 26 październik 2020, 22:00

1 odpowiedź

Najlepsza odpowiedź

P1. Czy klasa nadpisania (myhelloviSiSitor) zawsze zawiera metodę nadpisania do regulacji gramatyki?

Nie, możesz mieć pusty odwiedzający użytkownik, który rozszerza gość (generowany) baza. Należy również pamiętać, że nie ma praktycznej różnicy między regułą startową (często pierwszą regułą gramatyki i / lub reguły parsera, która kończy się EOF) i inną regułą parsera w gramatyce.

P2. Czy klasa nadpisywania (myhellovizytor) zawsze zawiera metodę nadpisania dla każdej reguły w gramatyce i klasie bazowej? Czy może mi zalegać pojedynczą metodę zainteresowania?

Nie, nie musisz zastąpić każdej reguły. Jednak odwiedzający jest często używany do wykonania pełnego przechodzenia drzewa analizy i powrotu czegoś. Oznaczałoby to ogólnie wszystkie metody wizyty mają niestandardową implementację. Jeśli selektywnie chcesz "słuchać" dla zdarzeń, takich jak wejście lub wychodzenie z określonej reguły parsera / węzła, słuchacz może być tym, co jesteś po: https://github.com/antlr/antlr4/blob/master/doc/listeners.md

0
Bart Kiers 26 październik 2020, 19:27