Merge pull request #1396 from janyou/swift-target-readme

update swift-target.md
This commit is contained in:
Terence Parr 2016-11-24 20:40:12 -08:00 committed by GitHub
commit 474c33e5db
1 changed files with 112 additions and 0 deletions

View File

@ -1 +1,113 @@
# ANTLR4 Language Target, Runtime for Swift # ANTLR4 Language Target, Runtime for Swift
### Usage
#### 1. Install ANTLR4
[The getting started guide](getting-started.md) should get you started.
#### 2. create a Swift lexer or parser
This is pretty much the same as creating a Java lexer or parser, except you need to specify the language target, for example:
```
$ antlr4 -Dlanguage=Swift MyGrammar.g4
```
For a full list of antlr4 tool options, please visit the [tool documentation page](tool-options.md).
#### 3. Get the Swift ANTLR runtime
You will find Swift runtime (framework project) in
```
antlr4/runtime/Swift
```
#### 4. Example
The example from [here](https://github.com/janyou/Antlr-Swift-Runtime/tree/master/Test)
(1). Hello.g4
```
grammar Hello;
r : 'hello' ID ;
ID : [a-z]+ ;
WS : [ \t\r\n]+ -> skip ;
```
(2). generate lexer/parser/visitor from Hello.g4 file
```
$ antlr4 -Dlanguage=Swift -visitor -o gen Hello.g4
```
in gen folder
```
Hello.tokens
HelloBaseListener.swift
HelloBaseVisitor.swift
HelloLexer.swift
HelloLexer.tokens
HelloLexerATN.swift
HelloListener.swift
HelloParser.swift
HelloParserATN.swift
HelloVisitor.swift
```
(3). make a custom listener
```
public class HelloWalker: HelloBaseListener{
public override func enterR(_ ctx: HelloParser.RContext) {
print( "enterR: " + ((ctx.ID()?.getText()) ?? ""))
}
public override func exitR(_ ctx: HelloParser.RContext) {
print( "exitR ")
}
}
```
(4). call and run
add TestHello.txt
```
hello world
```
run:
```
import Antlr4
....
do {
let textFileName = "TestHello.txt"
if let textFilePath = Bundle.main.path(forResource: textFileName, ofType: nil) {
let lexer = HelloLexer(ANTLRFileStream(textFilePath))
let tokens = CommonTokenStream(lexer)
let parser = try HelloParser(tokens)
let tree = try parser.r()
let walker = ParseTreeWalker()
try walker.walk(HelloWalker(),tree)
} else {
print("error occur: can not open \(textFileName)")
}
}catch ANTLRException.cannotInvokeStartRule {
print("error occur: CannotInvokeStartRule")
}catch ANTLRException.recognition(let e ) {
print("error occur\(e)")
}catch {
print("error occur")
}
```