85 lines
1.1 KiB
Plaintext
85 lines
1.1 KiB
Plaintext
|
// This is the yacc input for creating the parser for interpolation
|
||
|
// expressions in Go.
|
||
|
|
||
|
// To build it:
|
||
|
//
|
||
|
// go tool yacc -p "expr" expr.y (produces y.go)
|
||
|
//
|
||
|
|
||
|
%{
|
||
|
package config
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
%}
|
||
|
|
||
|
%union {
|
||
|
expr Interpolation
|
||
|
str string
|
||
|
variable InterpolatedVariable
|
||
|
args []Interpolation
|
||
|
}
|
||
|
|
||
|
%type <args> args
|
||
|
%type <expr> expr
|
||
|
%type <str> string
|
||
|
%type <variable> variable
|
||
|
|
||
|
%token <str> STRING IDENTIFIER
|
||
|
%token <str> COMMA LEFTPAREN RIGHTPAREN
|
||
|
|
||
|
%%
|
||
|
|
||
|
top:
|
||
|
expr
|
||
|
{
|
||
|
fmt.Printf("%#v", $1)
|
||
|
}
|
||
|
|
||
|
expr:
|
||
|
string
|
||
|
{
|
||
|
$$ = &LiteralInterpolation{Literal: $1}
|
||
|
}
|
||
|
| variable
|
||
|
{
|
||
|
$$ = &VariableInterpolation{Variable: $1}
|
||
|
}
|
||
|
| IDENTIFIER LEFTPAREN args RIGHTPAREN
|
||
|
{
|
||
|
$$ = &FunctionInterpolation{Func: $1, Args: $3}
|
||
|
}
|
||
|
|
||
|
args:
|
||
|
{
|
||
|
$$ = nil
|
||
|
}
|
||
|
| expr COMMA expr
|
||
|
{
|
||
|
$$ = append($$, $1, $3)
|
||
|
}
|
||
|
| expr
|
||
|
{
|
||
|
$$ = append($$, $1)
|
||
|
}
|
||
|
|
||
|
string:
|
||
|
STRING
|
||
|
{
|
||
|
$$ = $1
|
||
|
}
|
||
|
|
||
|
variable:
|
||
|
IDENTIFIER
|
||
|
{
|
||
|
var err error
|
||
|
$$, err = NewInterpolatedVariable($1)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
%%
|