Created
March 28, 2018 08:32
-
-
Save iosdevzone/e3617dbcd9d75d78453c1599b71f1901 to your computer and use it in GitHub Desktop.
Modified test for Antlr4 to demonstrate ParserTree crash
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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