forked from jasder/antlr
Merge pull request #1396 from janyou/swift-target-readme
update swift-target.md
This commit is contained in:
commit
474c33e5db
|
@ -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")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue