moonrockz/krueger/dialect does not have a README file
pub(all) struct Dialect {
name : String
rules : HashSet[Rule]
operators : Array[OperatorDef]
reserved_words : Array[String]
operator_symbols : Array[String]
attributes : AttributeSyntax
core_package : Bool
}test {
let base = @dialect.Dialect::elm_0_19_1()
let dialect = {
..base,
name: "my-elm",
operators: [
..base.operators,
{ symbol: "<=>", precedence: 4, direction: Non, },
],
operator_symbols: ["<=>"],
}
inspect(dialect.validate().length(), content="0")
let source = @scanner.SourceText::new(
"module Main exposing (..)\n\nx =\n a <=> b\n",
)
let plain = @parser.parse_module(
source,
@scanner.DefaultScanner::new(dialect=base),
dialect=base,
)
inspect(plain.diagnostics[0].title, content="UNKNOWN OPERATOR")
let custom = @parser.parse_module(
source,
@scanner.DefaultScanner::new(dialect~),
dialect~,
)
inspect(custom.diagnostics.length(), content="0")
}test {
let base = @dialect.Dialect::elm_0_19_1()
let rules = base.rules.copy()
rules.remove(LeadingZero)
let dialect = { ..base, rules, reserved_words: ["forall"], }
inspect(base.has(LeadingZero), content="true")
inspect(dialect.has(LeadingZero), content="false")
let parse = (text : String) => {
@parser.parse_module(
@scanner.SourceText::new(text),
@scanner.DefaultScanner::new(dialect~),
dialect~,
).diagnostics
}
inspect(parse("module Main exposing (..)\n\nx = 007\n").length(), content="0")
let errors = parse("module Main exposing (..)\n\nforall = 1\n")
inspect(
errors[0].message,
content="Malformed function declaration: expected a function name, found `forall`",
)
}test {
let dialect = @dialect.Dialect::elm_0_19_1()
inspect(dialect.name, content="elm-0.19.1")
inspect(dialect.has(PortInNormalModule), content="true")
debug_inspect(
dialect.operator("|>"),
content=(
#|Some({ symbol: "|>", precedence: 1, direction: Left })
),
)
}test {
let source = @scanner.SourceText::new(
"module Main exposing (..)\n\nx =\n 0X1F\n",
)
let parse = (dialect : @dialect.Dialect) => {
@parser.parse_module(
source,
@scanner.DefaultScanner::new(dialect~),
dialect~,
).diagnostics.length()
}
inspect(parse(@dialect.Dialect::elm_syntax_7_3_9()), content="0")
inspect(parse(@dialect.Dialect::elm_0_19_1()), content="1")
}pub(all) struct OperatorDef {
symbol : String
precedence : Int
direction : InfixDirection
} derive(Eq, Debug)pub(all) enum Rule {
LeadingZero
EmptyHex
BadUnicodeEscape
CharLength
IndentedContinuation
LetDeclarationColumn
ModuleLevelColumn
SpacedOperatorName
UppercaseHexPrefix
ExponentWithoutDigits
ImportColumn
NonAsciiDigitInName
TitlecaseNameStart
EffectModule
InfixDeclaration
DuplicateEffectKey
PortInNormalModule
} derive(Eq, Hash, Debug)test {
let elm = @dialect.Dialect::elm_0_19_1()
let oracle = @dialect.Dialect::elm_syntax_7_3_9()
// Both reject a char literal with two characters.
inspect(elm.has(CharLength) && oracle.has(CharLength), content="true")
// Only `elm make` rejects `007`.
inspect(elm.has(LeadingZero), content="true")
inspect(oracle.has(LeadingZero), content="false")
inspect(@dialect.Rule::LeadingZero.name(), content="leading-zero")
}Install
Download zipParser and parsing utilities for Elm and Elm-like dialects (e.g. Morphir) in MoonBit
Dependencies