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
|
import {
foldInside,
foldNodeProp,
indentNodeProp,
indentUnit,
LanguageSupport,
LRLanguage,
} from '@codemirror/language';
import { styleTags, tags as t } from '@lezer/highlight';
import { foldBlockComment, foldConjunction, foldDeclaration } from './folding';
import {
indentBlockComment,
indentDeclaration,
indentPredicateOrRule,
} from './indentation';
import { parser } from './problem.grammar';
const parserWithMetadata = parser.configure({
props: [
styleTags({
LineComment: t.lineComment,
BlockComment: t.blockComment,
'problem class enum pred fn indiv scope': t.definitionKeyword,
'abstract extends refers contains container opposite': t.modifier,
'default error contained containment': t.modifier,
'true false unknown error': t.keyword,
'int real string bool': t.keyword,
'may must current count': t.operatorKeyword,
'sum prod min max in': t.operatorKeyword,
// 'new delete': t.keyword,
NotOp: t.operator,
UnknownOp: t.operator,
OrOp: t.separator,
StarArgument: t.keyword,
'IntMult StarMult Real': t.number,
StarMult: t.number,
String: t.string,
'RelationName/QualifiedName': t.typeName,
// 'RuleName/QualifiedName': t.typeName,
'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,
FunctionBody: indentPredicateOrRule,
// RuleBody: indentPredicateOrRule,
BlockComment: indentBlockComment,
}),
foldNodeProp.add({
ClassBody: foldInside,
EnumBody: foldInside,
ParameterList: foldInside,
PredicateBody: foldInside,
FunctionBody: 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 default function problemLanguageSupport(): LanguageSupport {
return new LanguageSupport(problemLanguage, [indentUnit.of(' ')]);
}
|