I am writing a parser for a compiler . So for the constructor I have the code :
//constructor
Parser::Parser(char* file)
{
MyLex(file) ;
}
Upon compiling using g++ parsy.cpp parsydriver.cpp , I am however getting this error saying :
parsy.cpp: In constructor ‘Parser::Parser(char*)’:
parsy.cpp:13: error: no matching function for call to ‘Lex::Lex()’
lexy2.h:34: note: candidates are: Lex::Lex(char*)
lexy2.h:31: note: Lex::Lex(const Lex&)
parsy.cpp:15: error: no match for call to ‘(Lex) (char*&)’
Where am I going wrong ? Lex myLex is declared as private in the Parser header . I am at my wit's end . I tried using this :
//constructor
Parser::Parser(char* file):myLex(file)
{
}
My Lexical Analyser constructor is :
Lex::Lex(char* filename): ch(0)
{
//Set up the list of reserved words
reswords[begint] = "BEGIN";
reswords[programt] = "PROGRAM";
reswords[constt] = "CONST";
reswords[vart] = "VAR";
reswords[proceduret] = "PROCEDURE";
reswords[ift] = "IF";
reswords[whilet] = "WHILE";
reswords[thent] = "THEN";
reswords[elset] = "ELSE";
reswords[realt] = "REAL";
reswords[integert] = "INTEGER";
reswords[chart] = "CHAR";
reswords[arrayt] = "ARRAY";
reswords[endt] = "END";
//Open the file for reading
file.open(filename);
}
but, this creates a bunch of undefined reference to Lexical Analyser file and functions ! I have included the files properly. But so far , I don't understand how to get over this problem.
UPDATE The header file inclusions are :
parsy.h file :
#ifndef PARSER_H
#define PARSER_H
// other library file includes
#include "lexy2.h"
class Parser
{
}...
parsy.cpp file :
// usual ilbraries
#include "parsy.h"
using namespace std ;
Parser::Parser(char* file) ....
parsydriver.cpp :
// usual libraries
#include "parsy.h"
using namespace std ;
int main()
..
lexy2.cpp file :
I have included the lexy2.h file. Should I be including the parser header files in the lexical analyser ones ? Doesn't seem likely. But how should I tackle them then ?