Skip to content

Commit

Permalink
* Improve robustness of the GAstVisitor dispatching by runtime error …
Browse files Browse the repository at this point in the history
…throwing

  If none of the alternatives match.

* Fixes #136 - Rule production note visited.

* Removes type assertion in the Visitor Dispatching as the modern typescript compiler can infer
  those due to the instanceof operator and thus provide better type checking.

relates to #135
  • Loading branch information
bd82 committed Mar 9, 2016
1 parent 4f374a7 commit f126b2d
Showing 1 changed file with 18 additions and 10 deletions.
28 changes: 18 additions & 10 deletions src/parse/grammar/gast_public.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,36 +90,42 @@ export namespace gast {
export abstract class GAstVisitor {

public visit(node:IProduction) {

if (node instanceof NonTerminal) {
this.visitNonTerminal(<NonTerminal>node)
this.visitNonTerminal(node)
}
else if (node instanceof Flat) {
this.visitFlat(<Flat>node)
this.visitFlat(node)
}
else if (node instanceof Option) {
this.visitOption(<Option>node)
this.visitOption(node)
}
else if (node instanceof RepetitionMandatory) {
this.visitRepetitionMandatory(<RepetitionMandatory>node)
this.visitRepetitionMandatory(node)
}
else if (node instanceof RepetitionMandatoryWithSeparator) {
this.visitRepetitionMandatoryWithSeparator(<RepetitionMandatoryWithSeparator>node)
this.visitRepetitionMandatoryWithSeparator(node)
}
else if (node instanceof RepetitionWithSeparator) {
this.visitRepetitionWithSeparator(<RepetitionWithSeparator>node)
this.visitRepetitionWithSeparator(node)
}
else if (node instanceof Repetition) {
this.visitRepetition(<Repetition>node)
this.visitRepetition(node)
}
else if (node instanceof Alternation) {
this.visitAlternation(<Alternation>node)
this.visitAlternation(node)
}
else if (node instanceof Terminal) {
this.visitTerminal(<Terminal>node)
this.visitTerminal(node)
}
else if (node instanceof Rule) {
this.visitRule(node)
}
else {
throw Error("non exhaustive match")
}
}

/* istanbul ignore next */ // this is an "Abstract" method that does nothing, testing it is pointless.
public visitNonTerminal(node:NonTerminal):void {}

public visitFlat(node:Flat):void {}
Expand All @@ -137,5 +143,7 @@ export namespace gast {
public visitAlternation(node:Alternation):void {}

public visitTerminal(node:Terminal):void {}

public visitRule(node:Rule):void {}
}
}

0 comments on commit f126b2d

Please sign in to comment.