Skip to content

Instantly share code, notes, and snippets.

@iosdevzone
Created March 28, 2018 08:32
Show Gist options
  • Save iosdevzone/e3617dbcd9d75d78453c1599b71f1901 to your computer and use it in GitHub Desktop.
Save iosdevzone/e3617dbcd9d75d78453c1599b71f1901 to your computer and use it in GitHub Desktop.
Modified test for Antlr4 to demonstrate ParserTree crash
func calculatorHelper() -> ParseTree {
let input = "2 + 8 / 2"
let lexer = VisitorCalcLexer(ANTLRInputStream(input))
let parser = try! VisitorCalcParser(CommonTokenStream(lexer))
return try! parser.s()
}
func calculatorHelper2() -> VisitorCalcParser {
let input = "2 + 8 / 2"
let lexer = VisitorCalcLexer(ANTLRInputStream(input))
let parser = try! VisitorCalcParser(CommonTokenStream(lexer))
return parser
}
///
/// This test verifies that the visitor correctly dispatches calls for labeled outer alternatives.
///
func testCalculatorVisitor2() throws {
class Visitor: VisitorCalcBaseVisitor<Int> {
override func visitS(_ ctx: VisitorCalcParser.SContext) -> Int? {
return visit(ctx.expr()!)
}
override func visitNumber(_ ctx: VisitorCalcParser.NumberContext) -> Int? {
return Int((ctx.INT()?.getText())!)
}
override func visitMultiply(_ ctx: VisitorCalcParser.MultiplyContext) -> Int? {
let left = visit(ctx.expr(0)!)!
let right = visit(ctx.expr(1)!)!
if ctx.MUL() != nil {
return left * right
}
else {
return left / right
}
}
override func visitAdd(_ ctx: VisitorCalcParser.AddContext) -> Int? {
let left = visit(ctx.expr(0)!)!
let right = visit(ctx.expr(1)!)!
if ctx.ADD() != nil {
return left + right
}
else {
return left - right
}
}
}
let kaboom = true
let visitor = Visitor()
let expected = 6
let context: ParseTree
if kaboom {
context = calculatorHelper()
let result = visitor.visit(context)
XCTAssertEqual(expected, result!)
}
else {
let parser = calculatorHelper2()
context = try! parser.s()
let result = visitor.visit(context)
XCTAssertEqual(expected, result!)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment