more work on parser

This commit is contained in:
iamBadgers
2024-05-16 19:58:03 -07:00
parent eef238c834
commit f644c9001c
4 changed files with 721 additions and 15 deletions

View File

@@ -52,11 +52,11 @@ export function parseOrderByString(orderBy: string) {
const openGroupRegex = /\(/
const closeGroupRegex = /\)/
const conjunctinoRegex = /AND|OR/
const statementRegex = /([a-zA-Z]+)\s?(=|!=|<|>|<=|>=|:)\s?([a-zA-Z\d"']+)/
const equalityRegex = /([a-zA-Z]+)\s?(=|!=|<|>|<=|>=|:)\s?([a-zA-Z\d"']+)/
const spacerRegex = /\s/
export class FilterParser {
asty: ASTY = new ASTY()
lexer: Tokenizr = this.createLexer()
constructor() {}
@@ -76,21 +76,74 @@ export class FilterParser {
ctx.accept('conjunction', m[0])
})
tkz.rule(statementRegex, (ctx, m) => {
tkz.rule(equalityRegex, (ctx, m) => {
ctx.accept('column', m[1])
ctx.accept('opperator', m[2])
ctx.accept('value', m[3])
})
tkz.rule(spacerRegex, (ctx, m)=> {
ctx.ignore();
tkz.rule(spacerRegex, (ctx, m) => {
ctx.ignore()
})
return tkz
}
buildAST(): ASTY {
const ast = new ASTY()
parseFilter(filter: string) {
this.lexer.input(filter)
let block = this.parseBlock()
this.lexer.consume('EOF')
this.lexer.reset()
return block
}
private parseBlock() {
let items = []
for(;;) {
let nextItem = this.lexer.alternatives(
() => this.parseEquality(),
() => this.parseGroup(),
() => this.parseConjunction())
if (nextItem===undefined) {
break;
}
items.push(nextItem)
}
return items
}
private parseConjunction() {
}
private parseEquality() {
let columnToken = this.lexer.consume('column')
let opperatorToken = this.lexer.consume('opperator')
let valueToken = this.lexer.consume('value')
let node = this.asty.create('equality')
node.pos(columnToken.line, columnToken.column, columnToken.pos)
node.set(columnToken.type, columnToken.value)
node.set(opperatorToken.type, opperatorToken.value)
node.set(valueToken.type, valueToken.value)
return node
}
private parseGroup() {
this.lexer.consume('opengroup')
let block = this.parseBlock()
this.lexer.consume('closegroup')
let node = this.asty.create("group").set({ns: ""}).add(block)
return node
}
}