moonrockz/krueger/parser does not have a README file
pub(all) struct AttributeGroup {
target : AttributeTarget
attributes : ArrayView[DocAttribute]
} derive(Eq, Debug)test {
let text =
#|module Main exposing (price)
#|
#|{-| Prices.
#|
#|@docs price
#|-}
#|
#|{-| A price.
#|
#|@unit "EUR"
#|-}
#|price : Float
#|price =
#| 9.5
#|
let source = @scanner.SourceText::new(text)
let result = @parser.parse_module(source, @scanner.DefaultScanner::new())
inspect(result.diagnostics.length(), content="0")
// The first doc comment documents the module.
debug_inspect(result.attributes[0].target, content="Module")
guard result.attributes[0].attributes[0] is Docs(names~, ..) else {
fail("not @docs")
}
inspect(names[0].value, content="price")
// A later doc comment documents the declaration after it.
let group = result.attributes[1]
guard group.target is Declaration(name~, ..) else {
fail("not a declaration")
}
inspect(name, content="price")
guard group.attributes[0] is Attribute(name~, arguments~, ..) else {
fail("not an attribute")
}
inspect(name.value, content="unit")
debug_inspect(
arguments[0].value,
content=(
#|Literal("EUR")
),
)
}pub(all) struct ParseResult {
ast : File?
cst : ModuleCst?
diagnostics : Array[Diagnostic]
attributes : Array[AttributeGroup]
} derive(Eq, Debug)test {
let source = @scanner.SourceText::new(
"module Main exposing (x)\n\n{-| The answer. -}\nx = 42\n",
)
let result = @parser.parse_module(source, @scanner.DefaultScanner::new())
inspect(result.diagnostics.length(), content="0")
guard result.ast is Some(file) else { fail("no AST") }
inspect(file.declarations.length(), content="1")
guard result.cst is Some(cst) else { fail("no CST") }
inspect(cst.declarations.length(), content="1")
inspect(result.attributes.length(), content="0")
}test {
let text =
#|module Main exposing (x)
#|
#|{-| Answers.
#|
#|@since 2
#|-}
#|x = 42
#|
let source = @scanner.SourceText::new(text)
let result = @parser.parse_module(source, @scanner.DefaultScanner::new())
// The first doc comment documents the module.
let json = @parser.encode_attributes(result.attributes)
inspect(
json.stringify(),
content=(
#|[{"target":"module","attributes":[{"name":{"range":[5,2,5,7],"value":"since"},"arguments":[{"range":[5,8,5,9],"value":{"type":"integer","integer":2}}],"range":[5,1,5,9]}]}]
),
)
}test {
let text =
#|module Main exposing (x)
#|
#|{-| Ids.
#|
#|@id 9007199254740993
#|-}
#|x = 1
#|
let source = @scanner.SourceText::new(text)
let groups = @parser.parse_module(source, @scanner.DefaultScanner::new()).attributes
let exact = @parser.encode_attributes_with(groups, exact_ints=true).stringify()
inspect(exact.contains("9007199254740993"), content="true")
let nearest = @parser.encode_attributes(groups).stringify()
inspect(nearest.contains("9007199254740993"), content="false")
}test {
let dialect = @dialect.Dialect::elm_syntax_7_3_9()
let scanner = @scanner.DefaultScanner::new(dialect~)
let ok = @parser.parse_module(
@scanner.SourceText::new("module Main exposing (..)\n\nx = 1\n"),
scanner,
dialect~,
)
inspect(ok.diagnostics.length(), content="0")
let bad = @parser.parse_module(
@scanner.SourceText::new("module Main exposing (..)\n\n{- open\n"),
scanner,
dialect~,
)
inspect(bad.ast is None && bad.cst is None, content="true")
inspect(bad.diagnostics[0].code, content="KR-SCAN-001")
}test {
let dialect = @dialect.Dialect::elm_0_19_1()
let source = @scanner.SourceText::new(
"module Main exposing (..)\n\nx =\n 1 + 2 * 3\n",
)
guard @scanner.DefaultScanner::new(dialect~).tokenize(source) is Ok(tokens) else {
fail("scan error")
}
let result = @parser.parse_tokens(tokens, dialect~)
inspect(result.diagnostics.length(), content="0")
guard result.ast is Some(file) else { fail("no AST") }
guard file.declarations[0].value is FunctionDeclaration(f) else {
fail("not a function")
}
// `*` binds tighter than `+`, so `+` is the root.
guard f.declaration.value.expression.value is OperatorApplication(op, _, _, _) else {
fail("not an operator application")
}
inspect(op, content="+")
}Install
Download zipParser and parsing utilities for Elm and Elm-like dialects (e.g. Morphir) in MoonBit
Dependencies