![Page 1: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/1.jpg)
ANTLR 4
Parser Structure
Error RecoveringBy Alexander Vasiltsov
![Page 2: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/2.jpg)
class Grammar_NameParser : Parser {
class RuleContext : ParserRuleContext {...}
RuleContext rule();
class SubruleContext : ParserRuleContext {...}
class LabelContext : SubruleContext {...}
class Label_altContext : SubruleContext {...}
SubruleContext : subrule();
class LoopingContext : ParserRuleContext {...}
LoopingContext looping();
}
grammar Grammar_Name;
rule: subrule TOKEN;
subrule: looping+ # label
| TOKEN # label_alt
;
looping: looping
| TOKEN;
TOKEN: ‘TOKEN’;
Structure of generated parser
grammar Grammar_Name;
rule: subrule TOKEN;
subrule: looping+ # label
| TOKEN # label_alt
;
looping: looping
| TOKEN;
TOKEN: ‘TOKEN’;
class Grammar_NameParser : Parser {
class RuleContext : ParserRuleContext {...}
RuleContext rule();
class SubruleContext : ParserRuleContext {...}
class LabelContext : SubruleContext {...}
class Label_altContext : SubruleContext {...}
SubruleContext : subrule();
class LoopingContext : ParserRuleContext {...}
LoopingContext looping();
}
![Page 3: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/3.jpg)
Structure of Context classes (1)
rule: subrule TOKEN;
class RuleContext : ParserRuleContext {
RuleContext(ParserRuleContext parent, int invokingState) {...}
SubruleContext subrule() {...}
ITerminalNode TOKEN() {...}
void EnterRule(IParseTreeListener listener) {...}
void ExitRule(IParseTreeListener listener) {...}
TResult Accept<TResult>(IParseTreeVisitor<TResult> visitor) {...}
}
![Page 4: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/4.jpg)
Structure of Context classes (2)subrule: looping+ # label
| TOKEN # label_alt
;
class SubruleContext : ParserRuleContext {
SubruleContext(ParserRuleContext parent, int invokingState) {...}
}
class LabelContext : SubruleContext {
LabelContext(ParserRuleContext parent, int invokingState) {...}
IReadOnlyList<LoopingContext> looping() {...}
LoopingContext looping(int i) {...}
void EnterRule(IParseTreeListener listener) {...}
void ExitRule(IParseTreeListener listener) {...}
TResult Accept<TResult>(IParseTreeVisitor<TResult> visitor) {...}
}
class Label_altContext : SubruleContext {
Label_altContext(ParserRuleContext parent, int invokingState) {...}
ITerminalNode TOKEN() {...}
void EnterRule(IParseTreeListener listener) {...}
void ExitRule(IParseTreeListener listener) {...}
TResult Accept<TResult>(IParseTreeVisitor<TResult> visitor) {...}
}
![Page 5: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/5.jpg)
Structure of Context classes (3)
looping: looping
| TOKEN;
class LoopingContext : ParserRuleContext {
LoopingContext(ParserRuleContext parent, int invokingState) {...}
LoopingContext loopig() {...}
ITerminalNode TOKEN() {...}
void EnterRule(IParseTreeListener listener) {...}
void ExitRule(IParseTreeListener listener) {...}
TResult Accept<TResult>(IParseTreeVisitor<TResult> visitor) {...}
}
![Page 6: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/6.jpg)
ITree
![Page 7: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/7.jpg)
ParserRuleContext
![Page 8: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/8.jpg)
IToken
![Page 9: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/9.jpg)
ANTLR namespaces
Antlr4.Runtime
org.antlr.v4.runtime
Contains the most commonly used classes and interfaces, such
as the hierarchies for input streams, character and token
buffers, error handling, token construction, lexing, and parsing
Antlr4.Runtime.Atn
org.antlr.v4.atn
This is used internally for ANTLR’s Adaptive LL(*) lexing and
parsing strategy1
Antlr4.Runtime.Dfa
org.antlr.v4.dfa
Holds all of the DFA2 implementation classes
Antlr4.Runtime.Misc
org.antlr.v4.misc
Holds miscellaneous data structures but also the commonly
used TestRig class
Antlr4.Runtime.Sharpen Holds different helpers for C# target language
Antlr4.Runtime.Tree
org.antlr.v4.tree
This package holds all of the classes and interfaces needed to
implement parser trees
org.antlr.v4.runtime.tree.gui A basic parse tree viewer
1. http://en.wikipedia.org/wiki/Augmented_transition_network
2. http://en.wikipedia.org/wiki/Deterministic_finite_automaton
![Page 10: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/10.jpg)
Recognizer
![Page 11: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/11.jpg)
IIntStream
![Page 12: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/12.jpg)
ITokenFactory
![Page 13: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/13.jpg)
IAntlrErrorListener class diagram
![Page 14: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/14.jpg)
IAntlrErrorStrategy
![Page 15: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/15.jpg)
RecognitionException
![Page 16: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/16.jpg)
Let’s look at example
![Page 17: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/17.jpg)
Error Recovery
![Page 18: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/18.jpg)
Recovery process
● Each generated method is wrapped by try-
catch block
● reoprtError() - reports ErrorListener about
parsing error
● recover() - consumes tokens until it finds one
present in resynchronization set
![Page 19: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/19.jpg)
Resynchronization set
Resynchronization set is the union of rule
reference following sets for all the rules on the
invocation stack
Invocation Stack: [group, expr, atom]
Resynchronization Set: { ‘^’, ‘]’ }
![Page 20: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/20.jpg)
Recovering from mismatched tokens
class 9 T { int i; } class { int i; }
![Page 21: Binary Studio Academy PRO: ANTLR course by Alexander Vasiltsov (lesson 3)](https://reader033.vdocuments.us/reader033/viewer/2022052602/55a1b7351a28abdf398b465b/html5/thumbnails/21.jpg)
Recovering from errors in subrules
Subrule start: ● Parsers attempt single token
deletion
● Parsers don’t attempt single
token insertion
Looping subrule continuation
test:● Acts inside subrule that is looping
construct (...)+
● Parser tries to stay in the loop after
recovery
● Consumes tokens until it finds a token
consistent with one of following sets:
a) another iteration of the loop
b) what follows the loop
c) the resynchronization set of the
current