1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
import {
foldInside,
foldNodeProp,
indentNodeProp,
indentUnit,
LanguageSupport,
LRLanguage,
} from '@codemirror/language';
import { styleTags, tags as t } from '@lezer/highlight';
import { LRParser } from '@lezer/lr';
import { parser } from '../../build/generated/sources/lezer/problem';
import {
foldBlockComment,
foldConjunction,
foldDeclaration,
foldWholeNode,
} from './folding';
import {
indentBlockComment,
indentDeclaration,
indentPredicateOrRule,
} from './indentation';
const parserWithMetadata = (parser as LRParser).configure({
props: [
styleTags({
LineComment: t.lineComment,
BlockComment: t.blockComment,
'problem class enum pred rule indiv scope': t.definitionKeyword,
'abstract extends refers contains opposite error default': t.modifier,
'true false unknown error': t.keyword,
'may must current': t.operatorKeyword,
'new delete': t.operatorKeyword,
NotOp: t.operator,
UnknownOp: t.operator,
OrOp: t.punctuation,
StarArgument: t.keyword,
'IntMult StarMult Real': t.number,
StarMult: t.number,
String: t.string,
'RelationName/QualifiedName': t.typeName,
'RuleName/QualifiedName': t.macroName,
'IndividualNodeName/QualifiedName': t.atom,
'VariableName/QualifiedName': t.variableName,
'{ }': t.brace,
'( )': t.paren,
'[ ]': t.squareBracket,
'. .. , :': t.separator,
'<-> ==>': t.definitionOperator,
}),
indentNodeProp.add({
ProblemDeclaration: indentDeclaration,
UniqueDeclaration: indentDeclaration,
ScopeDeclaration: indentDeclaration,
PredicateBody: indentPredicateOrRule,
RuleBody: indentPredicateOrRule,
BlockComment: indentBlockComment,
}),
foldNodeProp.add({
ClassBody: foldInside,
EnumBody: foldInside,
ParameterList: foldInside,
PredicateBody: foldInside,
RuleBody: foldInside,
Conjunction: foldConjunction,
Consequent: foldWholeNode,
UniqueDeclaration: foldDeclaration,
ScopeDeclaration: foldDeclaration,
BlockComment: foldBlockComment,
}),
],
});
const problemLanguage = LRLanguage.define({
parser: parserWithMetadata,
languageData: {
commentTokens: {
block: {
open: '/*',
close: '*/',
},
line: '%',
},
indentOnInput: /^\s*(?:\{|\}|\(|\)|;|\.|==>)$/,
},
});
export function problemLanguageSupport(): LanguageSupport {
return new LanguageSupport(problemLanguage, [
indentUnit.of(' '),
]);
}
|