2016-05-30 8 views
0

J'écris un lexer et un parser pour les formules Excel.Ordre de préséance dans lexer

Dans Excel, nous pouvons attribuer un nom à une cellule. Par exemple, abc est un nom valide, alors qu'il est interdit de nommer une cellule B2 pour éviter la confusion avec la cellule B2. Donc, une fois que nous rencontrons une formule =B2, nous sommes sûrs que B2 fait référence à une cellule plutôt qu'à un nom défini par l'utilisateur.

Dans mes lexer_formula.mll, je identificateurs définis:

let lex_cell = ['A' - 'Z']+ ['0' - '9']+ (* regular expressions to include all the cells *) 
let lex_name = ['A' - 'Z' '0' - '9']+ (* regular expressions to include all the names *) 

Mais une chaîne comme B2 avec correspondre à la fois lex_cell et lex_name, personne ne sait comment je pourrais dire au lexer d'examiner d'abord lex_cell, puis lex_name? Sera-t-il suffisant de mettre lex_cell avant lex_name dans rule token = parse?

+0

Utilisez-vous réellement ocamllex? Vous avez beaucoup de tags, mais vous ne dites jamais quel générateur de scanner vous utilisez. – rici

+0

Oui, j'utilise 'ocamllex'. – SoftTimur

Répondre

0

Selon le ocamllex manual, il est suffisant pour mettre lex_cell première:

Si plusieurs expressions régulières correspondent à un préfixe de l'entrée, la règle du « plus long match » applique: l'expression régulière qui correspond au plus long préfixe l'entrée est sélectionnée. En cas d'égalité, l'expression régulière qui apparaît plus tôt dans la règle est sélectionnée.