2016-11-30 3 views
0

Je travaille sur un projet hobby qui utilise flex/bison pour générer un scanner/analyseur C++. Parce qu'il y a nombre de gazillions des objets d'analyse. L'analyse elle-même est un problème embarrassant parallèle. Je veux regrouper un objet analyseur/analyseur prêt à l'emploi et les laisser fonctionner en parallèle. J'ai lu le document officiel de Flex et Bison et parcouru leurs codes générés.Est généré C++ Bison parser re-entrant?

Je peux confirmer qu'à partir du document Flex et de son code, le scanner C++ générateur est de retour.

Cependant, j'ai du mal à le confirmer à partir du document Bison. Il a un document indiquant comment construire un analyseur C ré-entrant dans Bison. Mais cela n'implique pas explicitement que si vous construisez un analyseur C++, il est re-entrant. J'ai trouvé un couple de membre de classe statique dans Bison généré fichier d'en-tête de l'analyseur, ce qui me fait préoccupation à ce sujet:

// Tables. 
// YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing 
// STATE-NUM. 
static const short int yypact_[]; 

// YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. 
// Performed when YYTABLE does not specify something else to do. Zero 
// means the default is an error. 
static const unsigned char yydefact_[]; 

// YYPGOTO[NTERM-NUM]. 
static const signed char yypgoto_[]; 

// YYDEFGOTO[NTERM-NUM]. 
static const signed char yydefgoto_[]; 

// YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If 
// positive, shift that token. If negative, reduce the rule whose 
// number is the opposite. If YYTABLE_NINF, syntax error. 
static const short int yytable_[]; 

static const short int yycheck_[]; 

// YYSTOS[STATE-NUM] -- The (internal number of the) accessing 
// symbol of state STATE-NUM. 
static const unsigned char yystos_[]; 

// YYR1[YYN] -- Symbol number of symbol that rule YYN derives. 
static const unsigned char yyr1_[]; 

// YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. 
static const unsigned char yyr2_[]; 

est généré analyseur C++ Bison rentrante?

Répondre

1

Ce sont tous static const ce qui est totalement compatible avec la réentrance. Les tables définissent les règles de transition de l'analyseur et ne sont pas fondamentalement différentes du code exécutable de l'analyseur, qui est également statique et immuable.

+0

Très bon point! Voulez-vous dire que le tableau lui-même est const ou l'élément de tableau est const? J'ai besoin de trouver une référence C++ pour les différencier. –

+0

Les tableaux C++ (comme les tableaux C) ne peuvent pas être redimensionnés, donc il n'y a pas de différence entre le tableau étant const et les éléments du tableau étant const. – rici

+0

Merci pour votre réponse. J'ai passé en revue le chapitre const dans C++ Primer. Vivant dans le monde de Java trop longtemps, j'ai presque oublié cela. –