2015-10-20 11 views
0

我無法理解「用法:\ n \ tll'(a + a)'」在碼。它的功能是什麼?我正在使用g ++編譯器來編譯代碼。如果在命令提示符中傳遞了2個以上的參數,則會發生問題。「用法: n tll'(a + a)'」在ll1解析器程序中的含義

#include <iostream> 
#include <map> 
#include <stack> 

enum Symbols { 

    TS_L_PARENS,  
    TS_R_PARENS,  
    TS_A,  
    TS_PLUS,  
    TS_EOS,  
    TS_INVALID, 
    NTS_S,  
    NTS_F 
}; 
enum Symbols lexer(char c) 
{ 
switch(c) 
{ 
case '(': return TS_L_PARENS; 
case ')': return TS_R_PARENS; 
case 'a': return TS_A; 
case '+': return TS_PLUS; 
case '\0': return TS_EOS; 
default: return TS_INVALID; 
} 
} 
int main(int argc, char **argv) 
{ 
using namespace std; 
if (argc < 2) 
{ 
cout << **"usage:\n\tll '(a+a)'"** << endl; 
return 0; 
} 
map< enum Symbols, map<enum Symbols, int> > table; 
stack<enum Symbols> ss; // symbol stack 
char *p; // input buffer 
ss.push(TS_EOS); // terminal, $ 
ss.push(NTS_S);  // non-terminal, S 
p = &argv[1][0]; 
table[NTS_S][TS_L_PARENS] = 2; 
table[NTS_S][TS_A] = 1; 
table[NTS_F][TS_A] = 3; 
while(ss.size() > 0) 
{ 
if(lexer(*p) == ss.top()) 
{ 
cout << "Matched symbols: " << lexer(*p) << endl; 
p++; 
ss.pop(); 
} 
else 
{ 
cout << "Rule " << table[ss.top()][lexer(*p)] << endl; 
switch(table[ss.top()][lexer(*p)]) 
{ 
case 1: // 1. S → F 
ss.pop(); 
ss.push(NTS_F); // F 
break; 
case 2: // 2. S → (S + F) 
ss.pop(); 
ss.push(TS_R_PARENS); //) 
ss.push(NTS_F);  // F 
ss.push(TS_PLUS); // + 
ss.push(NTS_S);  // S 
ss.push(TS_L_PARENS); // (
break; 
case 3: // 3. F → a 
ss.pop(); 
ss.push(TS_A); // a 
break; 
default: 
cout << "parsing table defaulted" << endl; 
return 0; 
break; 
} 
} 
} 
cout << "finished parsing" << endl; 
return 0; 
} 

回答

0

cout是功能,"usage:\n\tll '(a+a)'"是傳遞給函數的字符串文字。在您的問題打印此位:

usage: 
    ll '(a+a)'