packages feed

funcons-intgen-0.2.0.1: src/Parsing/Mutual.hs

module Parsing.Mutual where

import Funcons.EDSL (SeqSortOp(..))

import GLL.Combinators

import Types.ConcreteSyntax
import Parsing.Lexer (mylexer)

type Parser a = BNF Token a

debug :: Parser a -> String -> [a]
debug p = parseWithOptions [throwErrors] p . mylexer 

-- solves ambiguity B:=>booleans
pDef :: Parser String
pDef = "DEF" <:=> keyword "~>" 

pVar :: Parser Var
pVar = "VAR" <:=> Nothing <$$  keychar '_'
             <||> Just    <$$> alt_id_lit 
             <||> Nothing <$$  keyword "..." 

pVarString :: Parser String
pVarString = "VAR" <:=> (:[]) <$$> keychar '_' <||> alt_id_lit 

pSynName :: Parser String
pSynName = "SYN-NAME" <:=> name_lit

pPostfix :: Parser SeqSortOp 
pPostfix = "POSTFIX"
  <::=> StarOp <$$ keychar '*'
  <||>  PlusOp <$$ keychar '+'
  <||>  QuestionMarkOp <$$ keychar '?'


-- TODO: debug pConst "\"\\\"\""
pConst :: Parser Const
pConst = "CONST"
  <:=>  ConstAtom <$$> atom_lit
  <||>  ConstString <$$> string_lit
  <||>  ConstNat  <$$> int_lit
  <||> ConstFloat <$$> float_lit -- TODO add float_lit to GLL.Combinators

-- tokens
atom_lit :: Parser String
atom_lit = token "ATOM"

name_lit :: Parser String
name_lit = id_lit

bar :: Parser String
bar = token "BAR"

file_name :: Parser String
file_name = token "FILE"

ordinal :: Parser String
ordinal = "NT-ORDINAL" <:=> token "ORDINAL" <||> (show <$$> int_lit)

double_quote :: Parser String
double_quote = token "DQUOTE"