@sschepis/resolang
Version:
ResoLang - Core quantum resonance computation library for browser and Node.js
93 lines (80 loc) • 2.52 kB
text/typescript
// ResoLang Validator - Syntax and structure validation
import { tokenize } from './lexer.js';
import type { ValidationResult, ValidationError } from './types.js';
/**
* Validate ResoLang source code
* Checks for syntax errors, unmatched braces, and structural issues
*/
export function validate(source: string): ValidationResult {
const errors: ValidationError[] = [];
const warnings: ValidationError[] = [];
try {
const tokens = tokenize(source);
// Check for basic syntax issues
let braceCount = 0;
let parenCount = 0;
let bracketCount = 0;
for (const token of tokens) {
if (token.type === 'LBRACE') braceCount++;
if (token.type === 'RBRACE') braceCount--;
if (token.type === 'LPAREN') parenCount++;
if (token.type === 'RPAREN') parenCount--;
if (token.type === 'LBRACKET') bracketCount++;
if (token.type === 'RBRACKET') bracketCount--;
if (token.type === 'ERROR') {
errors.push({
message: `Unexpected character: ${token.value}`,
line: token.line,
column: token.column,
severity: 'error',
});
}
}
if (braceCount !== 0) {
errors.push({
message: `Unmatched braces: ${braceCount > 0 ? 'missing }' : 'extra }'}`,
line: tokens[tokens.length - 1]?.line || 1,
column: 1,
severity: 'error',
});
}
if (parenCount !== 0) {
errors.push({
message: `Unmatched parentheses: ${parenCount > 0 ? 'missing )' : 'extra )'}`,
line: tokens[tokens.length - 1]?.line || 1,
column: 1,
severity: 'error',
});
}
if (bracketCount !== 0) {
errors.push({
message: `Unmatched brackets: ${bracketCount > 0 ? 'missing ]' : 'extra ]'}`,
line: tokens[tokens.length - 1]?.line || 1,
column: 1,
severity: 'error',
});
}
// Check for PROGRAM structure
const hasProgram = tokens.some(t => t.type === 'PROGRAM');
if (!hasProgram && tokens.length > 1) {
warnings.push({
message: 'No PROGRAM block found. Consider wrapping code in PROGRAM { ... }',
line: 1,
column: 1,
severity: 'warning',
});
}
} catch (error) {
errors.push({
message: error instanceof Error ? error.message : String(error),
line: 1,
column: 1,
severity: 'error',
});
}
return {
valid: errors.length === 0,
errors,
warnings,
};
}