Note that there are some explanatory texts on larger screens.

plurals
  1. POCompiling issue with Recursive Decent parser (c++)
    primarykey
    data
    text
    <p>I am having compiling issues with my c++ program, it is a recursive decent parser, these are the rules:</p> <pre><code>slist :: = stmt slist | stmt stmt ::= decl | assign | print decl ::= INT ID SC | FLOAT ID SC print ::= PRINT expr SC assign ::= ID EQUAL expr SC expr ::=term PLUS expr|term MINUS expr| term term ::= factor STAR term|factor DIV term| factor MOD term| factor factor ::= primary STARSTAR factor | primary primary ::= INTCONST | FLOATCONST | ID | LPAREN expr RPAREN </code></pre> <p>I am still relatively new to C++, so i am not sure if i screwed up on something or it is my compiler. I am using VIM on genome/ubuntu terminal environment, these are the errors i am getting when i go to compile, it looks like a missing include header file but i am 100% sure i have included the header file:</p> <p>my code:</p> <pre><code>#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; #include "p3lexer.h" // this is a list of node types enum PTreeNodetype { SLIST, DECL, ASSIGN, PRINT, MATH, EQUAL, TERM, MINUS, STAR, MOD, STARSTAR }; // this is a parse tree node class PTree { PTreeNodetype type; PTree *left; PTree *right; public: PTree(PTreeNodetype t, PTree *l=0, PTree *r=0) { type = t; left = l; right = r; } }; PTree *Slist(); PTree *Stmt(); PTree *Decl(); PTree *Print(); PTree *Assign(); PTree *Expr(); PTree *Term(); PTree *Factor(); PTree *Primary(); int main(int argc, char *argv[]) { if(argc == 2){ if(!setLexFile(argv[1])) return 0; } else setLexStdin(); Token *t; // this code just tests the lexer; you should comment it out later while( t = getToken() ) { cout &lt;&lt; t-&gt;getType() &lt;&lt; ":" &lt;&lt; t-&gt;getValue() &lt;&lt; endl; delete t; } // instead, this code! PTree *parse; parse = Slist(); if( parse == 0 ) { cout &lt;&lt; "Syntax error! " &lt;&lt; endl; return 0; } // here... a successful parse means we have to look at the tree } // slist :: = stmt slist | stmt PTree * Slist() { TokenType tt = t-&gt;getType(); //fix this!! if(tt != T_SLIST){ pushbacktoken(t); return 0; } delete t; PTree *stmt = Stmt(); if(!stmt){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; } else{ return new PTree(stmt, slist); } } // stmt ::= decl | assign | print PTree * Stmt() { Token *t = getToken(); TokenType tt = tt-&gt;getType(); if(tt != T_DECL &amp;&amp; T_ASSIGN &amp;&amp; T_PRINT){ pusbbacktoken(t); return 0; } delete t; return new(DECL, PRINT, ASSIGN); } // decl ::= INT ID SC | FLOAT ID SC PTree* Decl(){ Token *t = getToken(); TokenType tt = t-&gt;getType(); if(tt != T_INT &amp;&amp; tt != T_FLOAT){ pushbacktoken(t); return 0; } delete t; t = getToken(); if(t-&gt;getToken() != T_ID){ cout &lt;&lt; "Syntax Error!" &lt;&lt; endl; delete t; return 0; } string id = t-&gt;getValue(); delete t; t = getToke(); if(t-&gt;getType() != T_SC){ cout &lt;&lt; "syntax Error! " &lt;&lt; endl; delete t; return 0; } return new PTree(DECL); } //print := PRINT expr SC PTree* Print(){ Token *t = getToken(); TokenType tt = t-&gt;getType(); if(tt != T_PRINT){ pushbacktoken(t); return 0; } delete t; PTree *expr = Expr(); if(!expr){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; return 0; } t = getToken(); if(t-&gt;getToken() != T_SC){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; delete t; return 0; } return new PTree(PRINT, expr); } // assign ::= ID EQUAL expr SC PTree * Assign() { Token *t = getToke(); TokenType tt = t-&gt;getToken(); if(tt != T_ID){ pushbacktoken(t); return 0; //recheck this, something is missing from here } t = getToken(); if(t-&gt;getType != T_ID &amp;&amp; T_EQUAL){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; return 0; delete t; } string id = t-&gt; getValue(); delete t; Ptree *expr = Expr(); if(!expr){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; return 0; } t = getToken(); if(r-&gt;getToken() != T_SC){ cout &lt;&lt; "Syntrax error on line " &lt;&lt; endl; delete t; return 0; } return new PTree(Assign, expr); } // expr ::= term PLUS expr | term MINUS expr | term PTree * Expr() { Token *t = getToken(); TokenType tt = t-&gt;getType(); PTree *term = Term(); if(!term){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; return 0; } if(t-&gt;getType != T_PLUS &amp;&amp; t-&gt;getType() != T_MINUS) pushbacktoken(t); return *term; } else{ return Term(l); return Expr(r); } PTree *expr = Term(); if(!expr){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; return 0; } delete t; return new PTree(expr, term); } // term ::= factor STAR term | factor DIV term | factor MOD term | factor PTree * Term() { Token *t = getToken(); TokenType tt = t-&gt;getType(); PTree *factor = Factor(); if(!factor){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; return 0; } t = getToken(); if(t-&gt;getType() != T_STAR &amp;&amp; t-&gt;getType() != T_DIV &amp;&amp; t-&gt;getType != T_MOD){ pushbacktoken(t); return *factor; } else{ return Factor(l); return Expr(r); } PTree *term = Term(); if (!term){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; } delete t; PTree *factor = Factor(); if(!factor){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; return 0; } PTree *factor = Factor(); if(!factor){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; return 0; } return new PTree(term); } // factor ::= primary STARSTAR factor | primary PTree * Factor(){ Token *t = getToken(); TokenType tt = t-&gt;getType(); PTree *primary = Primary(); if(!primary){ cout &lt;&lt; "Syntac error on line " &lt;&lt; endl; return 0; } delete t; t = getToken(); if(t-&gt;getToke() != T_STARSTAR){ cout &lt;&lt; "Syntax error! " &lt;&lt; endl; } else{ return Primary(l); return Factor(r); } return new PTree(factor, primary); } // primary ::= INTCONST | FLOATCONST | ID | LPAREN expr RPAREN PTree * Primary(){ Token *t = getToken(); TokenType tt = t-&gt;getType(); if(tt != T-INTCONST &amp;&amp; T_FLOATCONST){ pushbacktoken(t); return 0; } delete t; t = getToken(); if(t-&gt;getType() != T_ID){ cout &lt;&lt; "Syntax Error on line " &lt;&lt; endl; delete t; return 0; } string id = t-&gt;getValue(); delete t; of(tt != T_LPAREN &amp;&amp; T_RPAREN){ pusbbacktoken(t); return 0; } delete t; PTree *expr = Expr(); if(!expr){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; return 0; } delete t; return new(primary) } 9895114/edit } </code></pre> <p>Here is the header file</p> <pre><code>extern int linenum; extern int errcnt; enum Tokentype { T_ERR, T_INT, T_FLOAT, T_PRINT, T_SC, T_EQUAL, T_PLUS, T_MINUS, T_STAR, T_DIV, T_MOD, T_STARSTAR, T_INTCONST, T_FLOATCONST, T_ID, T_LPAREN, T_RPAREN, }; class Token { Tokentype type; string value; int linenum; public: Token(Tokentype t, string v="") { type = t; value = v; linenum = ::linenum; } Tokentype getType() { return type; } string getValue() { return value; } int getLinenum() { return linenum; } }; extern void error(string); extern int setLexFile(char *); extern int setLexStdin(); extern Token *getToken(); extern void pushbacktoken( Token * ); </code></pre> <p>i want to see if the next thing is not a plus or minus token then push it back and just return what term returned. for example expr() if it IS a plus or minus, use what term returned for the left child and another call to Expr() for the right. I wrote the functions for them, but i am not too sophisticated with them, i added them on top, can someone please let me know if i am heading the right direction or not? and what i should fix?</p> <pre><code>// expr ::= term PLUS expr | term MINUS expr | term PTree * Expr() { Token *t = getToken(); Tokentype tt = t-&gt;getType(); PTree l = left(); PTree r = right(); PTree *term = Term(); if(!term){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; return 0; } else{ if(t-&gt;getType() != T_PLUS &amp;&amp; t-&gt;getType() != T_MINUS){ return 0; } else{ return left(); } } PTree *expr = Expr(); if(!expr){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; return 0; } else{ if(t-&gt;getType() != T_PLUS &amp;&amp; t-&gt;getType() != T_MINUS){ return 0; } else{ return right(); } delete t; return new PTree(expr, term); } // term ::= factor STAR term | factor DIV term | factor MOD term | factor PTree * Term() { Token *t = getToken(); Tokentype tt = t-&gt;getType(); t = getToken() PTree l = left(); PTree r = right(); PTree *factor = Factor(); if(!factor){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; return 0; } else{ if(t-&gt;getType() != T_STAR &amp;&amp; t-&gt;getType() != T_DIV &amp;&amp; t-&gt;getType() != T_MOD){ pushbacktoken(t) return 0; } else{ return left(); } } PTree *term = Term(); if (!term){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; return 0; } else{ if(t-&gt;getType() != T_STAR &amp;&amp; t-&gt;getType() != T_DIV &amp;&amp; t-&gt;getType() !=T_MOD){ pushbacktoken(t); return 0; } else{ return right(); } } return new PTree(term); } // factor ::= primary STARSTAR factor | primary PTree * Factor(){ Token *t = getToken(); Tokentype tt = t-&gt;getType(); PTree l = left(); PTree r = right(); PTree *primary = Primary(); if(!primary){ cout &lt;&lt; "Syntac error on line " &lt;&lt; endl; return 0; } else{ if(t-&gt;getType() != T_STARSTAR){ return 0; } else{ return left(); } } PTree *factor = Factor(); if(!factor){ cout &lt;&lt; "Syntax error on line " &lt;&lt; endl; return 0; } else{ if(t-&gt;getType() != T_STARSTAR){ return 0; } else{ return right(); } return new PTree(factor, primary); } </code></pre> <p>I am getting these errors</p> <pre><code>problem3.cpp: In function ‘PTree* Expr()’: problem3.cpp:225:17: error: too few arguments to function ‘std::ios_base&amp; std::left(std::ios_base&amp;)’ /usr/include/c++/4.6/bits/ios_base.h:918:3: note: declared here problem3.cpp:226:18: error: too few arguments to function ‘std::ios_base&amp; std::right(std::ios_base&amp;)’ /usr/include/c++/4.6/bits/ios_base.h:926:3: note: declared here problem3.cpp:238:16: error: too few arguments to function ‘std::ios_base&amp; std::left(std::ios_base&amp;)’ /usr/include/c++/4.6/bits/ios_base.h:918:3: note: declared here problem3.cpp:252:16: error: too few arguments to function ‘std::ios_base&amp; std::right(std::ios_base&amp;)’ </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload