Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 16 additions & 4 deletions lamagraph-compiler/src/Lamagraph/Compiler/Parser.y
Original file line number Diff line number Diff line change
Expand Up @@ -239,11 +239,16 @@ atomic_type :: { LLmlType LmlcPs }
---------------
-- Constants --
---------------

constant :: { XLocated LmlcPs (LmlLit LmlcPs) }
: integer_literal { sL1 $1 $ LmlInt noExtField (getInt $1) }
| char_literal { sL1 $1 $ LmlChar noExtField (getChar $1) }
| string_literal { sL1 $1 $ LmlString noExtField (getString $1)}

signed_constant :: { XLocated LmlcPs (LmlLit LmlcPs) }
: constant { $1 }
| '-' integer_literal { sLL $1 $2 $ LmlInt noExtField (getMinusInt $2) }

--------------
-- Patterns --
--------------
Expand All @@ -266,7 +271,7 @@ simple_pattern :: { LLmlPat LmlcPs }
: delimited_pattern { $1 }
| value_name { sL1 $1 $ LmlPatVar noExtField $1 }
| '_' { sL1 $1 $ LmlPatAny noExtField }
| constant { sL1 $1 $ LmlPatConstant noExtField (unLoc $1) }
| signed_constant { sL1 $1 $ LmlPatConstant noExtField (unLoc $1) }
| constr %prec below_DOT { sL1 $1 $ LmlPatConstruct noExtField $1 Nothing }
| tuple_pattern '|' tuple_pattern { sLL $1 $3 $ LmlPatOr noExtField $1 $3 }
| constr tuple_pattern %prec constr_appl { sLL $1 $2 $ LmlPatConstruct noExtField $1 (Just $2)}
Expand Down Expand Up @@ -315,8 +320,12 @@ compound_expr :: { LLmlExpr LmlcPs }
sLL $1 $2 $ LmlExprApply noExtField prefixIdent (pure $2)
}
| '-' compound_expr %prec prec_unary_minus
{ let prefixIdent = sL1 $1 $ LmlExprIdent noExtField (mkLongident $ pure "~-") in
sLL $1 $2 $ LmlExprApply noExtField prefixIdent (pure $2)
{ case unLoc $2 of
LmlExprConstant _ (LmlInt _ n) ->
sLL $1 $2 $ LmlExprConstant noExtField (LmlInt noExtField (-n))
_ ->
let prefixIdent = sL1 $1 $ LmlExprIdent noExtField (mkLongident $ pure "~-")
in sLL $1 $2 $ LmlExprApply noExtField prefixIdent (pure $2)
}
| simple_expr infix_op compound_expr
{ let infixIdent = sL1 $2 $ LmlExprIdent noExtField ((mkLongident . pure . unLoc) $2) in
Expand Down Expand Up @@ -530,7 +539,10 @@ getLongident :: NonEmpty LToken -> Longident
getLongident = mkLongident . fmap getIdent

getInt :: LToken -> Int
getInt (L _ (TokInt val)) = val
getInt (L _ (TokInt val)) = Prelude.read $ toString val

getMinusInt :: LToken -> Int
getMinusInt (L _ (TokInt val)) = Prelude.read $ ("-" ++ (toString val))

getChar :: LToken -> Char
getChar (L _ (TokChar val)) = val
Expand Down
5 changes: 3 additions & 2 deletions lamagraph-compiler/src/Lamagraph/Compiler/Parser/Lexer.x
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ import Lamagraph.Compiler.Parser.SrcLoc

$digit = [0-9]
$letter = [a-zA-Z]

$capital_letter = [A-Z]
$lowercase_letter = [a-z]

Expand All @@ -71,7 +72,7 @@ $operator_char = [\! \$ \% & \* \+ \. \/ \: \< \= \> \? \@ \^ \| \~]
)

-- Integer literals
@integer_literal = \-? $digit ( $digit | \_ )*
@integer_literal = $digit ( $digit | \_ )*

-- Operators
@infix_symbol = ( \= | \< | \> | \@ | \^ | \| | & | \+ | \- | \* | \/ | \$ | \% ) ( $operator_char )*
Expand Down Expand Up @@ -226,7 +227,7 @@ tokAnyIdent ctor input@(startPosn, _, _, str) len = do

tokInt :: AlexAction LToken
tokInt input@(startPosn, _, _, str) len = do
let num = read $ toString $ Text.take len str
let num = Text.take len str
return $ L
(alexPosnToSrcSpan startPosn $ getEndPos input len)
(TokInt num)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ data IdentType = Capitalized | Lowercase
data Token
= TokIdent IdentType Text
| {- Integer literals -}
TokInt Int
TokInt Text
| {- Character literals -}
TokChar Char
| {- String literals -}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ lowercaseIdent =
integerLiteral :: TestTree
integerLiteral =
testCase "Lex Int literal" $ do
getTokenTypesFromText "42" @?= Right [TokInt 42, TokEOF]
getTokenTypesFromText "42" @?= Right [TokInt "42", TokEOF]

allLetterKeywords :: TestTree -- Yep, strange name
allLetterKeywords =
Expand Down
1 change: 1 addition & 0 deletions lamagraph-compiler/test/golden/eval/output/Minus64.lml.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
-9223372036854775807-9223372036854775807-9223372036854775806-9223372036854775806-9223372036854775806
18 changes: 18 additions & 0 deletions lamagraph-compiler/test/golden/eval/source/Minus64.lml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
module Minus64

let bad_number_spaced = -9223372036854775808
let bad_number=-9223372036854775808
let bad_number_plus=9223372036854775807

(* val x: int *)
let f0 x = x + -9223372036854775808
let f1 x = x + - 9223372036854775808
let f2 x = x- 9223372036854775807
let f3 x = x-9223372036854775807
let f4 x = x -9223372036854775807

let s = print_int (f0 1)
let s = print_int (f1 1)
let s = print_int (f2 1)
let s = print_int (f3 1)
let s = print_int (f4 1)
Loading