mirror of
https://github.com/stedolan/jq.git
synced 2024-05-11 05:55:39 +00:00
79 lines
1.7 KiB
Plaintext
79 lines
1.7 KiB
Plaintext
{
|
|
module Parser where
|
|
import Lexer
|
|
import JQ
|
|
import Text.JSON
|
|
import Debug.Trace
|
|
import Data.List
|
|
import Control.Monad.Error
|
|
import Control.Monad.Reader
|
|
}
|
|
|
|
%name runParser Exp
|
|
%tokentype { Token }
|
|
|
|
%monad { Either String }
|
|
%error { \t -> fail $ "parse error: unexpected " ++ if null t then [] else (show $ head t) }
|
|
|
|
%token
|
|
'|' { TRes "|" }
|
|
'.' { TRes "." }
|
|
'[' { TRes "[" }
|
|
']' { TRes "]" }
|
|
'{' { TRes "{" }
|
|
'}' { TRes "}" }
|
|
'(' { TRes "(" }
|
|
')' { TRes ")" }
|
|
',' { TRes "," }
|
|
':' { TRes ":" }
|
|
'==' { TRes "==" }
|
|
'+' { TRes "+" }
|
|
Ident { TIdent $$ }
|
|
String { TString $$ }
|
|
Int { TInt $$ }
|
|
|
|
%left '|'
|
|
%left ','
|
|
%nonassoc '=='
|
|
%left '+'
|
|
|
|
%%
|
|
|
|
Exp
|
|
: Exp '|' Exp { $1 >| $3 }
|
|
| Exp ',' Exp { $1 `mplus` $3 }
|
|
| Exp '==' Exp { liftM2 eqj $1 $3 }
|
|
| Exp '+' Exp { liftM2 plusj $1 $3 }
|
|
| Term { $1 }
|
|
|
|
ExpD
|
|
: ExpD '|' ExpD { $1 >| $3 }
|
|
| ExpD '==' ExpD { liftM2 eqj $1 $3 }
|
|
| Term { $1 }
|
|
|
|
|
|
Term
|
|
: '.' { ask }
|
|
| Term '.' Ident { $1 >| index $3 }
|
|
| '.' Ident { index $2 }
|
|
| String { constStr $1 }
|
|
| Term '[' Exp ']' { do {t <- $1; i <- $3; lookupj t i} }
|
|
| Term '[' ']' { $1 >| childp }
|
|
| '(' Exp ')' { $2 }
|
|
| '[' Exp ']' { arrayp $2 }
|
|
| Int { constInt $1 }
|
|
| '{' MkDict '}' { dictp $2 }
|
|
| Ident '(' Exp ')' { callp $1 [$3] }
|
|
| Ident { callp $1 [] }
|
|
|
|
MkDict
|
|
: { [] }
|
|
| MkDictPair { [$1] }
|
|
| MkDictPair ',' MkDict { $1:$3 }
|
|
|
|
MkDictPair
|
|
: Ident ':' ExpD { (constStr $1, $3) }
|
|
| Ident { (constStr $1, index $1) }
|
|
| String ':' ExpD { (constStr $1, $3) }
|
|
| '(' Exp ')' ':' ExpD{ ($2, $5) }
|