more work on parser
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user