2010-08-28 5 views
0

J'ai essayé de modifier l'exemple mini_c de boost :: spirit pour qu'il corresponde à mon vocabulaire existant.Implémentation de "NOT" dans boost :: spirit mini_c

J'ai donc ajouté un opérateur « NOT qui doit se comporter égale comme « »:

unary_expr = 
     primary_expr 
    | ("NOT" > primary_expr   [op(op_not)]) // This does not work 
    | ('!' > primary_expr    [op(op_not)]) 
    | ('-' > primary_expr    [op(op_neg)]) 
    | ('+' > primary_expr) 
    ; 

Je peux compiler le code source modifié, mais lorsque je tente de l'exécuter, il ne parvient pas à analyser comment puis-je. résoudre ce

EDIT: Comme mon besoin d'accéder à des variables externes, j'avais fait une autre modification afin de construire une liste de ces variables lors de la compilation:

identifier %= 
    raw[lexeme[alpha >> *(alnum | '§' | '_' | '.' | '-')]] 
    ; 
variable = 
     identifier  [add_var(_1)] 
    ; 

Où add_var et identifiant sont définis comme

rule<Iterator, std::string(), white_space> identifier; 
function<var_adder> add_var; 

Si je ne l'utilise pas cette modification, "NOT" peut être utilisé. Avec la modification, l'utilisation de "NOT" génère une erreur d'analyse.

EDIT 2: Les expressions conditionnelles suivantes ne fonctionnent bien:

logical_expr = 
    relational_expr 
    >> *( ("AND" > relational_expr  [op(op_and)]) 
     | ("OR" > relational_expr  [op(op_or)]) 
     ) 
    ; 

Répondre

2

Avec votre changement le petit test:

int main() 
{ 
    return NOT 1; 
} 

avec succès et retourne parse 0. Donc ce n'est pas évident pour moi ce qui ne marche pas pour toi. Pourriez-vous également fournir un exemple d'entrée qui échoue, s'il vous plaît?

+0

J'ai également apporté d'autres modifications. S'il vous plaît voir mon post édité. –

+0

La première modification que vous avez faite (le 'identifier% = ...') n'est pas liée aux problèmes que vous voyez. C'est le deuxième changement (le 'variable = ...') qui est problématique. Essentiellement, ce que vous avez fait est d'autoriser les déclarations de variables implicites en ajoutant aveuglément tout identifiant rencontré dans la table de symboles. Ce n'est pas seulement dangereux, mais dans votre cas, ajoute le 'NOT' à cette table, provoquant les erreurs au moment de l'analyse. – hkaiser

+0

Désolé pour ma réponse tardive: Oui, nous autorisons toutes les variables inconnues pendant l'analyse, car il y a des millions de références possibles et il est beaucoup moins cher de vérifier seulement les quelques expressions qui sont dans les expressions analysées. analyseur Je comprends bien votre explication. Mais pourquoi les chaînes pour logical_expr fonctionnent-elles (voir edit en post). Merci beaucoup. –

Questions connexes