Split up main labelTokenizing routine
This commit is contained in:
parent
955c74be42
commit
0a6bf2fba4
|
|
@ -103,40 +103,48 @@ const tokenizeComment = (line: string, row: number): Token[] | undefined => {
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
const tokenizeLabelToken = (line: string, row: number): Token[] | undefined => {
|
const tokenizeHeader = (label: HeaderType, separator: string, paramString: string, row: number): Token[] => {
|
||||||
|
const token: HeaderToken = {
|
||||||
|
type: "header",
|
||||||
|
value: label,
|
||||||
|
loc: { row, col: 0 },
|
||||||
|
};
|
||||||
|
const param: TextToken = {
|
||||||
|
type: "text",
|
||||||
|
value: paramString,
|
||||||
|
loc: {
|
||||||
|
row,
|
||||||
|
col: label.length + separator.length,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
return [token, param];
|
||||||
|
};
|
||||||
|
|
||||||
|
const tokenizeInterval = (label: IntervalType, separator: string, paramString: string, row: number): Token[] => {
|
||||||
|
const token: IntervalToken = {
|
||||||
|
type: "interval",
|
||||||
|
value: label,
|
||||||
|
loc: { row, col: 0 },
|
||||||
|
};
|
||||||
|
const params = tokenizeParams(paramString, {
|
||||||
|
row,
|
||||||
|
col: label.length + separator.length,
|
||||||
|
});
|
||||||
|
return [token, ...params];
|
||||||
|
};
|
||||||
|
|
||||||
|
const tokenizeLabeledLine = (line: string, row: number): Token[] | undefined => {
|
||||||
const [, label, separator, paramString] = line.match(/^(\w+)(:\s*)(.*?)\s*$/) || [];
|
const [, label, separator, paramString] = line.match(/^(\w+)(:\s*)(.*?)\s*$/) || [];
|
||||||
if (!label) {
|
if (!label) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isHeaderType(label)) {
|
if (isHeaderType(label)) {
|
||||||
const token: HeaderToken = {
|
return tokenizeHeader(label, separator, paramString, row);
|
||||||
type: "header",
|
|
||||||
value: label,
|
|
||||||
loc: { row, col: 0 },
|
|
||||||
};
|
|
||||||
const param: TextToken = {
|
|
||||||
type: "text",
|
|
||||||
value: paramString,
|
|
||||||
loc: {
|
|
||||||
row,
|
|
||||||
col: label.length + separator.length,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
return [token, param];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isIntervalType(label)) {
|
if (isIntervalType(label)) {
|
||||||
const token: IntervalToken = {
|
return tokenizeInterval(label, separator, paramString, row);
|
||||||
type: "interval",
|
|
||||||
value: label,
|
|
||||||
loc: { row, col: 0 },
|
|
||||||
};
|
|
||||||
const params = tokenizeParams(paramString, {
|
|
||||||
row,
|
|
||||||
col: label.length + separator.length,
|
|
||||||
});
|
|
||||||
return [token, ...params];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new ParseError(`Unknown label "${label}:"`, { row, col: 0 });
|
throw new ParseError(`Unknown label "${label}:"`, { row, col: 0 });
|
||||||
|
|
@ -144,7 +152,7 @@ const tokenizeLabelToken = (line: string, row: number): Token[] | undefined => {
|
||||||
|
|
||||||
const tokenizeRule = (line: string, row: number): Token[] => {
|
const tokenizeRule = (line: string, row: number): Token[] => {
|
||||||
return (
|
return (
|
||||||
tokenizeLabelToken(line, row) ||
|
tokenizeLabeledLine(line, row) ||
|
||||||
tokenizeComment(line, row) || [{ type: "text", value: line.trim(), loc: { row, col: 0 } }]
|
tokenizeComment(line, row) || [{ type: "text", value: line.trim(), loc: { row, col: 0 } }]
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue