@softwareventures/maintain-project
Version:
Automatically create and maintain TypeScript projects with standard settings for Software Ventures Limited
72 lines • 2.44 kB
JavaScript
import { first, tail } from "@softwareventures/array";
import { scanSpdxExpression } from "./scan.js";
export function parseSpdxExpression(text) {
const tokens = scanSpdxExpression(text);
const [expression, rest] = parseCompoundExpression(tokens);
if (expression == null || rest.length !== 0) {
return { invalidText: text };
}
else {
return expression;
}
}
function parseCompoundExpression(tokens) {
return parseOperatorExpression(tokens, "OR", tokens => parseOperatorExpression(tokens, "AND", parseAtom));
}
function parseOperatorExpression(tokens, operator, next) {
const [left, tokens2] = next(tokens);
if (left == null) {
return [null, tokens];
}
if (first(tokens2)?.type !== operator) {
return [left, tokens2];
}
const [right, tokens3] = next(tail(tokens2));
if (right == null) {
return [null, tokens];
}
return [{ left, operator, right }, tokens3];
}
function parseAtom(tokens) {
const [parenthesizedExpression, tokens2] = parseParenthesizedExpression(tokens);
if (parenthesizedExpression != null) {
return [parenthesizedExpression, tokens2];
}
const [licenseExpression, tokens3] = parseLicenseReferenceExpression(tokens);
if (licenseExpression != null) {
return [licenseExpression, tokens3];
}
return [null, tokens];
}
function parseParenthesizedExpression(tokens) {
if (first(tokens)?.type !== "(") {
return [null, tokens];
}
const [expression, tokens2] = parseCompoundExpression(tail(tokens));
if (first(tokens2)?.type !== ")") {
return [null, tokens];
}
return [expression, tokens2];
}
function parseLicenseReferenceExpression(tokens) {
const identifier = first(tokens);
if (identifier?.type !== "identifier") {
return [null, tokens];
}
const tokens2 = tail(tokens);
const plus = first(tokens2)?.type === "+";
const tokens3 = plus ? tail(tokens2) : tokens2;
if (first(tokens3)?.type !== "WITH") {
return [{ licenseId: identifier.text, plus }, tokens3];
}
const tokens4 = tail(tokens3);
const exceptionIdentifier = first(tokens4);
if (exceptionIdentifier?.type !== "identifier") {
return [null, tokens];
}
return [
{ licenseId: identifier.text, plus, exceptionId: exceptionIdentifier.text },
tail(tokens4)
];
}
//# sourceMappingURL=parse.js.map