Bonjour tout le monde,
J'écris un parser (mon premier parser!) pour reconnaître les chaînes de caractère de ce type : TERM : MATCH_TERM. J'écris ce parser en utilisant Chevrotain, mon code est en TypeScript mais l'erreur que j'ai ne provient pas de l'utilisation du TypeScript.
J'avais initialement permis d'écrire la partie TERM uniquement entre guillemets simples ou doubles ('TERM' ou "TERM"). Je voudrais maintenant permettre d'écrire la partie TERM sans guillemets autour.
Mes regex pour reconnaître la partie TERM entourée de guillemets fonctionnent bien et sont les suivantes :
Pour ces expressions régulières, je n'avais pas besoin de spécifier le caractère : comme marquant la fin du token, car le guillemet avait déjà cet usage.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 const StringDoubleQuote = createToken({ name: "StringDoubleQuote", pattern: /"[^"\\]*(?:\\.[^"\\]*)*"/ }); const StringSimpleQuote = createToken({ name: "StringSimpleQuote", pattern: /'[^'\\]*(?:\\.[^'\\]*)*'/ });
Pour rendre possible l'écriture de la partie TERM sans guillemets autour, j'ai utilisé l'expression régulière suivante :
Pour définir la partie lexer du parser créé avec chevrotain j'ai écrit le code suivant qui définit les tokens possibles :
Code : Sélectionner tout - Visualiser dans une fenêtre à part const StringWithoutQuote = createToken({ name: "StringWithoutQuote", pattern: /[\w!@#\$%\^&.-]+/ });
Mon problème maintenant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 const StringWithoutQuote = createToken({ name: "StringWithoutQuote", pattern: /[\w!@#\$%\^&.-]+/ }); const StringDoubleQuote = createToken({ name: "StringDoubleQuote", pattern: /"[^"\\]*(?:\\.[^"\\]*)*"/ }); const StringSimpleQuote = createToken({ name: "StringSimpleQuote", pattern: /'[^'\\]*(?:\\.[^'\\]*)*'/ }); const And = createToken({ name: "And", pattern: /(AND|and)/ }); const Or = createToken({ name: "Or", pattern: /(OR|or)/ }); const WhiteSpace = createToken({ name: "WhiteSpace", pattern: /[ \t\n\r]+/, group: Lexer.SKIPPED }); const Colon = createToken({ name: "Colon", pattern: /:/ }); const Star = createToken({ name: "Star", pattern: /\*/ }); //.... Many other token const allTokens = [ WhiteSpace, Colon, Star, And, Or, //À ce niveau, j'ai également essayé de placer StringWithoutQuote après les chaînes de caractères avec guillemets dans le tableau allTokens. StringWithoutQuote, StringDoubleQuote, StringSimpleQuote ];
Je vais prendre deux chaînes de caractère d'exemple :
- aggregateType:*
- orderInfo.orderDate:*
Pour la première chaîne de caractère (aggregateType:*) quelle que soit la syntaxe utilisée (avec ou sans guillemets) le parser fonctionne bien et renvoie le résultat attendu.
Mais pour la deuxième chaîne de caractère (orderInfo.orderDate:*), la syntaxe avec guillemets ('orderInfo.orderDate':* ou "orderInfo.orderDate":*) permet au parser de bien fonctionner et de me retourner le résultat attendu.
Mais avec la syntaxe sans guillemets (orderInfo.orderDate:*), le parser me renvoie l'erreur suivante : Error : Failing to parse of string <orderInfo.orderDate:*>. Je ne suis pas sûr, mais j'ai vraiment l'impression que c'est l'ajout d'un point . dans la partie TERM qui cause l'erreur. Pourtant, dans ma regex (/[\w!@#\$%\^&.-]+/) j'ai bien mis que le point . fait partie de mes caractères spéciaux à prendre en compte dans le token créé.
Quelqu'un voit-il ce que j'ai fait de mal et qui provoque ce comportement ?
Merci d'avance si vous prenez le temps de m'aider.
Partager