Extension and grammar
This commit is contained in:
parent
26d11eea19
commit
1a948bcae7
@ -11,7 +11,7 @@ function mkOp($, opExpr) {
|
||||
|
||||
module.exports = grammar({
|
||||
name: 'CameLigo',
|
||||
word: $ => $.Keyword,
|
||||
word: $ => $.Keyword,
|
||||
extras: $ => [$.ocaml_comment, $.comment, /\s/],
|
||||
|
||||
rules: {
|
||||
@ -23,52 +23,47 @@ module.exports = grammar({
|
||||
$.include,
|
||||
),
|
||||
|
||||
include: $ => seq('#include', field("filename", $.String)),
|
||||
include: $ => seq(
|
||||
'#include',
|
||||
field("filename", $.String)
|
||||
),
|
||||
|
||||
_attribute: $ => /\[@@[a-z]+\]/,
|
||||
|
||||
argument: $ => seq(
|
||||
"(",
|
||||
field("argPattern", $._pattern),
|
||||
":",
|
||||
field("annotExpr", $.type_expr),
|
||||
")"
|
||||
),
|
||||
|
||||
let_decl: $ => seq(
|
||||
"let",
|
||||
field("binder", $._binder),
|
||||
field("name", $._binder),
|
||||
optional(seq(
|
||||
":",
|
||||
field("annotExpr", $.type_expr)
|
||||
field("type", $.type_expr)
|
||||
)),
|
||||
"=",
|
||||
field("letExpr",$._let_expr),
|
||||
field("body",$._program),
|
||||
repeat(field("attribute", $._attribute))
|
||||
),
|
||||
|
||||
_binder: $ => choice(
|
||||
field("letBinds", $.let_binds),
|
||||
field("letPat", $._pattern)
|
||||
$.func_header,
|
||||
$._pattern
|
||||
),
|
||||
|
||||
//========== EXPR ============
|
||||
|
||||
_let_expr: $ => choice(
|
||||
_program: $ => choice(
|
||||
$.let_expr1,
|
||||
$._expr
|
||||
),
|
||||
|
||||
let_binds: $ => prec(1, seq(
|
||||
func_header: $ => prec(1, seq(
|
||||
optional(field("recursive", "rec")),
|
||||
field("bindName", $.Name),
|
||||
repeat(field("bindArgument", $.argument))
|
||||
field("name", $.Name),
|
||||
repeat(field("arg", $.paren_pattern))
|
||||
)),
|
||||
|
||||
let_expr1: $ => seq(
|
||||
$.let_decl,
|
||||
"in",
|
||||
field("innerExpr", $._let_expr)
|
||||
field("innerExpr", $._program)
|
||||
),
|
||||
|
||||
// [1;2]
|
||||
@ -171,10 +166,10 @@ module.exports = grammar({
|
||||
"if",
|
||||
field("condition", $._expr),
|
||||
"then",
|
||||
field("thenBranch", $._let_expr),
|
||||
field("thenBranch", $._program),
|
||||
optional(seq(
|
||||
"else",
|
||||
field("elseBranch", $._let_expr)
|
||||
field("elseBranch", $._program)
|
||||
))
|
||||
)),
|
||||
|
||||
@ -191,12 +186,12 @@ module.exports = grammar({
|
||||
matching: $ => seq(
|
||||
field("pattern", $._pattern),
|
||||
"->",
|
||||
field("matchingExpr", $._let_expr)
|
||||
field("matchingExpr", $._program)
|
||||
),
|
||||
|
||||
lambda_expr: $ => seq(
|
||||
"fun",
|
||||
repeat1(field("arg", $.argument)),
|
||||
repeat1(field("arg", $.paren_pattern)),
|
||||
"->",
|
||||
field("body", $._expr)
|
||||
),
|
||||
@ -236,13 +231,13 @@ module.exports = grammar({
|
||||
|
||||
block_expr: $ => seq(
|
||||
"begin",
|
||||
sepBy(";", field("elem", $._let_expr)),
|
||||
sepBy(";", field("elem", $._program)),
|
||||
"end",
|
||||
),
|
||||
|
||||
paren_expr: $ => seq(
|
||||
"(",
|
||||
field("innerExpr", $._let_expr),
|
||||
field("innerExpr", $._program),
|
||||
optional(seq(
|
||||
":",
|
||||
field("annotExpr", $.type_expr)
|
||||
|
@ -13,4 +13,17 @@ import Product
|
||||
import Parser
|
||||
import ParseTree
|
||||
|
||||
-- import Debug.Trace
|
||||
-- import Debug.Trace
|
||||
|
||||
example :: FilePath
|
||||
example = "../../../src/test/contracts/address.mligo"
|
||||
|
||||
raw :: IO ()
|
||||
raw = toParseTree (Path example)
|
||||
>>= print . pp
|
||||
|
||||
-- sample :: IO ()
|
||||
-- sample
|
||||
-- = toParseTree (Path example)
|
||||
-- >>= runParserM . recognise
|
||||
-- >>= print . pp . fst
|
||||
|
@ -15,7 +15,7 @@ import ParseTree
|
||||
|
||||
-- import Debug.Trace
|
||||
|
||||
example :: FilePath
|
||||
-- example :: FilePath
|
||||
-- example = "../../../src/test/contracts/arithmetic.ligo"
|
||||
-- example = "../../../src/test/contracts/address.ligo"
|
||||
-- example = "../../../src/test/contracts/annotation.ligo"
|
||||
@ -36,7 +36,6 @@ example :: FilePath
|
||||
-- example = "../../../src/test/contracts/bytes_arithmetic.ligo"
|
||||
-- example = "../../../src/test/contracts/chain_id.ligo"
|
||||
-- example = "../../../src/test/contracts/closure-3.ligo"
|
||||
example = "../../../src/test/contracts/coase.ligo"
|
||||
|
||||
sample' :: FilePath -> IO (LIGO Info)
|
||||
sample' f
|
||||
@ -49,16 +48,16 @@ source' f
|
||||
= toParseTree (Path f)
|
||||
>>= print . pp
|
||||
|
||||
sample :: IO ()
|
||||
sample
|
||||
= toParseTree (Path example)
|
||||
>>= runParserM . recognise
|
||||
>>= print . pp . fst
|
||||
-- sample :: IO ()
|
||||
-- sample
|
||||
-- = toParseTree (Path example)
|
||||
-- >>= runParserM . recognise
|
||||
-- >>= print . pp . fst
|
||||
|
||||
source :: IO ()
|
||||
source
|
||||
= toParseTree (Path example)
|
||||
>>= print . pp
|
||||
-- source :: IO ()
|
||||
-- source
|
||||
-- = toParseTree (Path example)
|
||||
-- >>= print . pp
|
||||
|
||||
recognise :: RawTree -> ParserM (LIGO Info)
|
||||
recognise = descent (\_ -> error . show . pp) $ map usingScope
|
||||
|
@ -23,9 +23,9 @@ data UnsupportedExtension = UnsupportedExtension String
|
||||
getExt :: MonadThrow m => FilePath -> m Ext
|
||||
getExt path = do
|
||||
case takeExtension path of
|
||||
"religo" -> return Reason
|
||||
"ligo" -> return Pascal
|
||||
"mligo" -> return Caml
|
||||
".religo" -> return Reason
|
||||
".ligo" -> return Pascal
|
||||
".mligo" -> return Caml
|
||||
ext -> throwM $ UnsupportedExtension ext
|
||||
|
||||
onExt :: ElimExt a -> FilePath -> IO a
|
||||
|
@ -113,10 +113,8 @@ toParseTree = unsafeDebounce \fin -> do
|
||||
} (srcPath fin)
|
||||
|
||||
parser <- ts_parser_new
|
||||
-- True <- ts_parser_set_language parser tree_sitter_PascaLigo
|
||||
True <- ts_parser_set_language parser language
|
||||
|
||||
src <- srcToBytestring fin
|
||||
True <- ts_parser_set_language parser language
|
||||
src <- srcToBytestring fin
|
||||
|
||||
BS.useAsCStringLen src \(str, len) -> do
|
||||
tree <- ts_parser_parse_string parser nullPtr str len
|
||||
@ -136,7 +134,7 @@ toParseTree = unsafeDebounce \fin -> do
|
||||
trees <- for nodes \node' -> do
|
||||
(only -> (r :> _, tree :: ParseTree RawTree)) <- go fin src node'
|
||||
field <-
|
||||
if nodeFieldName node' == nullPtr
|
||||
if nodeFieldName node' == nullPtr
|
||||
then return ""
|
||||
else peekCString $ nodeFieldName node'
|
||||
return $ make (r :> Text.pack field :> Nil, tree)
|
||||
@ -146,7 +144,7 @@ toParseTree = unsafeDebounce \fin -> do
|
||||
let
|
||||
start2D = nodeStartPoint node
|
||||
finish2D = nodeEndPoint node
|
||||
i = fromIntegral
|
||||
i = fromIntegral
|
||||
|
||||
let
|
||||
range = Range
|
||||
@ -166,7 +164,6 @@ toParseTree = unsafeDebounce \fin -> do
|
||||
|
||||
return $ make (range :> "" :> Nil, ParseTree
|
||||
{ ptName = Text.pack ty
|
||||
-- , ptChildren = fromList . fmap (Comment,) $ trees -- TODO
|
||||
, ptChildren = trees
|
||||
, ptSource = cutOut range src
|
||||
})
|
||||
|
Loading…
Reference in New Issue
Block a user