i should've made a lisp man this sucks

This commit is contained in:
crumbtoo
2024-01-28 19:33:05 -07:00
parent 7d42f9b641
commit ab979cb934
3 changed files with 56 additions and 2 deletions

View File

@@ -10,6 +10,7 @@ module Rlp.Lex
, lexStream
, lexDebug
, lexCont
, popLexState
)
where
import Codec.Binary.UTF8.String (encodeChar)
@@ -73,6 +74,17 @@ $white_no_nl+ ;
-- for the definition of `doBol`
<0> \n { beginPush bol }
<layout>
{
}
-- layout keywords
<0>
{
"let" { constToken TokenLet `thenBeginPush` layout_let }
}
-- scan various identifiers and reserved words. order is important here!
<0>
{
@@ -110,6 +122,14 @@ $white_no_nl+ ;
() { doBol }
}
<layout_let>
{
\n { beginPush bol }
"{" { explicitLBrace }
"in" { constToken TokenIn `thenDo` (popLexState *> popLayout) }
() { doLayout }
}
<layout_top>
{
\n ;
@@ -144,6 +164,12 @@ thenBegin act c inp l = do
psLexState . _head .= c
pure a
thenBeginPush :: LexerAction a -> Int -> LexerAction a
thenBeginPush act c inp l = do
a <- act inp l
pushLexState c
pure a
andBegin :: LexerAction a -> Int -> LexerAction a
andBegin act c inp l = do
psLexState . _head .= c
@@ -342,6 +368,7 @@ explicitRBrace inp l = do
doLayout :: LexerAction (Located RlpToken)
doLayout _ _ = do
i <- indentLevel
traceM $ "doLayout: i: " <> show i
pushLayout (Implicit i)
popLexState
insertLBrace