Skip to content

Commit 47b27a8

Browse files
committed
reinstate parser test files
1 parent 9c71565 commit 47b27a8

17 files changed

Lines changed: 517 additions & 12 deletions
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { Builder } from '@traqula/core';
2+
import type { SparqlQuery, SparqlGrammarRule } from '@traqula/rules-sparql-1-1';
3+
import { lex as l, SparqlParser, gram } from '@traqula/rules-sparql-1-1';
4+
import { queryUnitParserBuilder } from './queryUnitParser';
5+
import { updateParserBuilder } from './updateUnitParser';
6+
7+
/**
8+
* Query or update, optimized for the Query case.
9+
* One could implement a new rule that does not use BACKTRACK.
10+
*/
11+
const queryOrUpdate: SparqlGrammarRule<'queryOrUpdate', SparqlQuery> = {
12+
name: 'queryOrUpdate',
13+
impl: ({ SUBRULE, OR, BACKTRACK }) => () => OR<SparqlQuery>([
14+
{ GATE: BACKTRACK(gram.queryUnit, undefined), ALT: () => SUBRULE(gram.queryUnit, undefined) },
15+
{ ALT: () => SUBRULE(gram.updateUnit, undefined) },
16+
]),
17+
};
18+
19+
export const sparql11ParserBuilder = Builder.createBuilder(queryUnitParserBuilder)
20+
.merge(updateParserBuilder, <const> [])
21+
.addRule(queryOrUpdate);
22+
23+
export class Parser extends SparqlParser<SparqlQuery> {
24+
public constructor() {
25+
const parser = sparql11ParserBuilder.consumeToParser({
26+
tokenVocabulary: l.sparql11Tokens.build(),
27+
});
28+
super({
29+
path: parser.path,
30+
query: parser.queryOrUpdate,
31+
});
32+
}
33+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import { Builder } from '@traqula/core';
2+
import { gram } from '@traqula/rules-sparql-1-1';
3+
4+
const rulesNoBuiltIn = <const> [
5+
gram.expression,
6+
gram.conditionalOrExpression,
7+
gram.conditionalAndExpression,
8+
gram.valueLogical,
9+
gram.relationalExpression,
10+
gram.numericExpression,
11+
gram.expressionList,
12+
gram.additiveExpression,
13+
gram.multiplicativeExpression,
14+
gram.unaryExpression,
15+
gram.primaryExpression,
16+
gram.brackettedExpression,
17+
// BuiltInCall,
18+
gram.iriOrFunction,
19+
gram.rdfLiteral,
20+
gram.numericLiteral,
21+
gram.numericLiteralUnsigned,
22+
gram.numericLiteralPositive,
23+
gram.numericLiteralNegative,
24+
gram.booleanLiteral,
25+
gram.var_,
26+
gram.builtInStr,
27+
gram.builtInLang,
28+
gram.builtInLangmatches,
29+
gram.builtInDatatype,
30+
gram.builtInBound,
31+
gram.builtInIri,
32+
gram.builtInUri,
33+
gram.builtInBnodeSparqlJs,
34+
gram.builtInRand,
35+
gram.builtInAbs,
36+
gram.builtInCeil,
37+
gram.builtInFloor,
38+
gram.builtInRound,
39+
gram.builtInConcat,
40+
gram.builtInStrlen,
41+
gram.builtInUcase,
42+
gram.builtInLcase,
43+
gram.builtInEncode_for_uri,
44+
];
45+
46+
const builtInPatch: typeof gram.builtInCall = {
47+
name: 'builtInCall',
48+
impl: ({ OR, SUBRULE }) => () => OR(gram.builtInCallList(SUBRULE).slice(0, -2)),
49+
};
50+
51+
export const expressionParserBuilder = Builder.createBuilder(rulesNoBuiltIn)
52+
.addMany(
53+
gram.builtInContains,
54+
gram.builtInStrstarts,
55+
gram.builtInStrends,
56+
gram.builtInStrbefore,
57+
gram.builtInStrafter,
58+
gram.builtInYear,
59+
gram.builtInMonth,
60+
gram.builtInDay,
61+
gram.builtInHours,
62+
gram.builtInMinutes,
63+
gram.builtInSeconds,
64+
gram.builtInTimezone,
65+
gram.builtInTz,
66+
gram.builtInNow,
67+
gram.builtInUuid,
68+
gram.builtInStruuid,
69+
gram.builtInMd5,
70+
gram.builtInSha1,
71+
gram.builtInSha256,
72+
gram.builtInSha384,
73+
gram.builtInSha512,
74+
gram.builtInCoalesce,
75+
gram.builtInIf,
76+
gram.builtInStrlang,
77+
gram.builtInStrdt,
78+
gram.builtInSameterm,
79+
gram.builtInIsiri,
80+
gram.builtInIsuri,
81+
gram.builtInIsblank,
82+
gram.builtInIsliteral,
83+
gram.builtInIsnumeric,
84+
gram.regexExpression,
85+
gram.substringExpression,
86+
gram.strReplaceExpression,
87+
gram.aggregateCount,
88+
gram.aggregateSum,
89+
gram.aggregateMin,
90+
gram.aggregateMax,
91+
gram.aggregateAvg,
92+
gram.aggregateSample,
93+
gram.aggregateGroup_concat,
94+
gram.aggregate,
95+
gram.iri,
96+
gram.prefixedName,
97+
gram.argList,
98+
gram.string,
99+
)
100+
.addRule(builtInPatch);
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
export * from './expressionParser';
12
export * from './objectListParser';
3+
export * from './queryUnitParser';
4+
export * from './Parser';
5+
export * from './subSelectParser';
26
export * from './triplesBlockParser';
37
export * from './triplesTemplateParserBuilder';
8+
export * from './updateNoModifyParser';
9+
export * from './updateUnitParser';
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { Builder } from '@traqula/core';
2+
import { gram, lex } from '@traqula/rules-sparql-1-1';
3+
import { subSelectParserBuilder } from './subSelectParser';
4+
import { triplesTemplateParserBuilder } from './triplesTemplateParserBuilder';
5+
6+
const rules = <const> [
7+
gram.queryUnit,
8+
gram.query,
9+
gram.prologue,
10+
gram.selectQuery,
11+
gram.constructQuery,
12+
gram.describeQuery,
13+
gram.askQuery,
14+
gram.valuesClause,
15+
gram.baseDecl,
16+
gram.prefixDecl,
17+
];
18+
19+
export const queryUnitParserBuilder = Builder.createBuilder(rules)
20+
// Select Query
21+
.merge(subSelectParserBuilder, <const> [])
22+
.addRule(gram.datasetClause)
23+
.addRule(gram.datasetClauseStar)
24+
.addRule(gram.defaultGraphClause)
25+
.addRule(gram.namedGraphClause)
26+
.addRule(gram.sourceSelector)
27+
// Construct Query
28+
.addRule(gram.constructTemplate)
29+
.merge(triplesTemplateParserBuilder, <const> [])
30+
.addRule(gram.constructTriples);
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { Builder } from '@traqula/core';
2+
import { gram } from '@traqula/rules-sparql-1-1';
3+
import { expressionParserBuilder } from './expressionParser';
4+
import { triplesBlockParserBuilder } from './triplesBlockParser';
5+
6+
const rules = <const> [
7+
gram.subSelect,
8+
gram.selectClause,
9+
gram.whereClause,
10+
gram.solutionModifier,
11+
gram.valuesClause,
12+
];
13+
14+
export const subSelectParserBuilder = Builder.createBuilder(rules)
15+
.merge(expressionParserBuilder, <const> [])
16+
.patchRule(gram.builtInCall)
17+
.addMany(
18+
gram.existsFunc,
19+
gram.notExistsFunc,
20+
gram.groupGraphPattern,
21+
gram.groupGraphPatternSub,
22+
)
23+
.merge(triplesBlockParserBuilder, <const> [])
24+
.addMany(
25+
gram.graphPatternNotTriples,
26+
gram.groupOrUnionGraphPattern,
27+
gram.optionalGraphPattern,
28+
gram.minusGraphPattern,
29+
gram.graphGraphPattern,
30+
gram.serviceGraphPattern,
31+
gram.filter,
32+
gram.bind,
33+
gram.inlineData,
34+
gram.constraint,
35+
gram.functionCall,
36+
gram.dataBlock,
37+
gram.inlineDataOneVar,
38+
gram.inlineDataFull,
39+
gram.dataBlockValue,
40+
// Solution modifier
41+
gram.groupClause,
42+
gram.havingClause,
43+
gram.orderClause,
44+
gram.limitOffsetClauses,
45+
gram.groupCondition,
46+
gram.havingCondition,
47+
gram.orderCondition,
48+
gram.limitClause,
49+
gram.offsetClause,
50+
);

engines/parser-sparql-1-1/lib/triplesTemplateParserBuilder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Builder } from '@traqula/core';
2-
import { gram } from '@traqula/rules-sparql-1-1';
2+
import { gram, lex } from '@traqula/rules-sparql-1-1';
33

44
const rules = <const> [
55
gram.triplesTemplate,
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { Builder } from '@traqula/core';
2+
import type { UpdateOperation } from '@traqula/rules-sparql-1-1';
3+
import { gram } from '@traqula/rules-sparql-1-1';
4+
import { triplesTemplateParserBuilder } from './triplesTemplateParserBuilder';
5+
6+
const update1Patch: typeof gram.update1 = {
7+
name: 'update1',
8+
impl: ({ SUBRULE, OR }) => () => OR<UpdateOperation>([
9+
{ ALT: () => SUBRULE(gram.load, undefined) },
10+
{ ALT: () => SUBRULE(gram.clear, undefined) },
11+
{ ALT: () => SUBRULE(gram.drop, undefined) },
12+
{ ALT: () => SUBRULE(gram.add, undefined) },
13+
{ ALT: () => SUBRULE(gram.move, undefined) },
14+
{ ALT: () => SUBRULE(gram.copy, undefined) },
15+
{ ALT: () => SUBRULE(gram.create, undefined) },
16+
{ ALT: () => SUBRULE(gram.insertData, undefined) },
17+
{ ALT: () => SUBRULE(gram.deleteData, undefined) },
18+
{ ALT: () => SUBRULE(gram.deleteWhere, undefined) },
19+
]),
20+
gImpl: gram.update1.gImpl,
21+
};
22+
23+
const rulesNoUpdate1 = <const>[
24+
gram.updateUnit,
25+
gram.update,
26+
gram.prologue,
27+
// Update1,
28+
gram.baseDecl,
29+
gram.prefixDecl,
30+
gram.load,
31+
gram.clear,
32+
gram.drop,
33+
gram.add,
34+
gram.move,
35+
gram.copy,
36+
gram.create,
37+
gram.insertData,
38+
gram.deleteData,
39+
gram.deleteWhere,
40+
gram.iri,
41+
gram.prefixedName,
42+
gram.graphRef,
43+
gram.graphRefAll,
44+
gram.graphOrDefault,
45+
gram.quadData,
46+
gram.quads,
47+
];
48+
49+
/**
50+
* Simple SPARQL 1.1 Update parser excluding MODIFY operations.
51+
* Top enable MODIFY, you need to path the update1 rule.
52+
*/
53+
export const updateNoModifyParserBuilder = Builder
54+
.createBuilder(rulesNoUpdate1)
55+
.addRule(update1Patch)
56+
.merge(triplesTemplateParserBuilder, <const> [])
57+
.addRule(gram.quadPattern)
58+
.addRule(gram.quadsNotTriples);
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Builder } from '@traqula/core';
2+
import { gram } from '@traqula/rules-sparql-1-1';
3+
import { objectListBuilder } from './objectListParser';
4+
import { subSelectParserBuilder } from './subSelectParser';
5+
import { updateNoModifyParserBuilder } from './updateNoModifyParser';
6+
7+
export const updateParserBuilder = Builder.createBuilder(updateNoModifyParserBuilder)
8+
.patchRule(gram.update1)
9+
.addMany(
10+
gram.modify,
11+
gram.deleteClause,
12+
gram.insertClause,
13+
gram.usingClause,
14+
gram.defaultGraphClause,
15+
gram.namedGraphClause,
16+
gram.sourceSelector,
17+
gram.usingClauseStar,
18+
gram.groupGraphPattern,
19+
)
20+
// This substitutes all of propertyListNotEmpty
21+
.merge(objectListBuilder, <const> [])
22+
.merge(subSelectParserBuilder, <const> []);

0 commit comments

Comments
 (0)