Initial Commit

This commit is contained in:
2023-08-21 16:56:17 -07:00
commit 1ab5eb3c6a
13 changed files with 2315 additions and 0 deletions

20
internal/parser/lexer.go Normal file
View File

@@ -0,0 +1,20 @@
package parser
import (
"github.com/alecthomas/participle/v2/lexer"
)
var lex = lexer.MustSimple([]lexer.SimpleRule{
{Name: "header", Pattern: `TAF (AMD|COR)? ?`},
{Name: "Remark", Pattern: `RMK .*`},
{Name: "Number", Pattern: `\d+`},
{Name: "Modifier", Pattern: `[+-]|VC`},
{Name: "Prob", Pattern: "PROB"},
{Name: "Slash", Pattern: `/`},
{Name: "Descriptor", Pattern: `MI|BC|DR|BL|SH|TS|FZ|PR`},
{Name: "Precip", Pattern: `DZ|RA|SN|SG|IC|PL|GR|GS|UP`},
{Name: "Obscur", Pattern: "BR|FG|FU|DU|SA|HZ|PY|VA"},
{Name: "Phenom", Pattern: "PO|SQ|FC|SS|DS"},
{Name: "Ident", Pattern: `[A-Z]+`},
{Name: "WS", Pattern: `[ \t\n\r]+`},
})

98
internal/parser/parser.go Normal file
View File

@@ -0,0 +1,98 @@
package parser
import (
"github.com/alecthomas/participle/v2"
"github.com/alecthomas/participle/v2/lexer"
)
type AST struct {
Items []*Item `@@*`
}
type Item struct {
Pos lexer.Position
Time *string `( @Number "Z" WS`
Valid *ValidPair ` @@`
Probability *Probability `| @@`
Change *Change `| @@`
WindSpeed *WindSpeed `| @@`
Visibility *Visibility `| @@`
SkyCondition *SkyCondition `| @@`
Vicinity *Vicinity `| @@`
Weather *Weather `| @@`
Temperature *Temperature `| @@`
Flag *Flag `| @@`
Remark *string `| @Remark`
ID *string `| @Ident ) WS?`
}
type ValidPair struct {
Pos lexer.Position
Start string `@Number "/"`
End string `@Number`
}
type Probability struct {
Pos lexer.Position
Value string `Prob @Number`
Time string `(WS @Number)?`
}
type WindSpeed struct {
Pos lexer.Position
WindShear string `("WS" @Number "/")?`
Variable bool `@"VRB"?`
Value string `@Number`
Gusts string `("G" @Number)?`
Unit string `@("MPS"|"KMH"|"KT")`
}
type Visibility struct {
Pos lexer.Position
Plus bool `@"P"?`
Value string `@Number @WS? @(Number? "/" Number)?`
Unit string `@"SM"?`
}
type SkyCondition struct {
Pos lexer.Position
Type string `@("FEW"|"SCT"|"BKN"|"OVC"|"VV"|"SKC")`
Altitude string `@Number?`
CloudType string `@("CB"|"TCU")?`
}
type Vicinity struct {
Pos lexer.Position
Descriptor string `"VC" ( @Descriptor`
Precipitation string ` | @Precip )`
}
type Weather struct {
Pos lexer.Position
Modifier string `@Modifier?`
Descriptor string `@Descriptor?`
Precipitation string ` ( @Precip`
Obscuration string ` | @Obscur`
Other string ` | @Phenom )`
}
type Change struct {
Pos lexer.Position
Type string `@("FM"|"BECMG"|"TEMPO")`
Time string `@Number?`
Valid *ValidPair `WS? @@?`
}
type Temperature struct {
Pos lexer.Position
Type string `@("TX"|"TN")`
Value string `@Number "/"`
Time string `@Number "Z"`
}
type Flag struct {
Pos lexer.Position
CAVOK bool `@"CAVOK"`
}
var Parser = participle.MustBuild[AST](participle.Lexer(lex))