00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #include "ebnf_la_node.hh"
00047 #include "token_spec.hh"
00048
00049 #ifdef DEBUG
00050
00051 ITokenSpec *EbnfLaNode::tokens = NULL;
00052
00053 int EbnfLaNode::indent_level = 0;
00054
00055 void EbnfLaNode::dumpAttributes (ostream &os) const
00056 {
00057 os << "[";
00058 if (nullable) os << "n ";
00059 else os << "- ";
00060 if (tokens != NULL)
00061 {
00062 {
00063 os << "FIRST(";
00064 vBitset &v = const_cast<vBitset&>(first);
00065 for (int j = 0; j < v.length(); j++)
00066 if (v[j].get())
00067 os << (*tokens)[j].name() << " ";
00068 os << ")";
00069 }
00070 {
00071 os << "FOLLOW(";
00072 vBitset &v = const_cast<vBitset&>(follow);
00073 for (int j = 0; j < v.length(); j++)
00074 if (v[j].get())
00075 os << (*tokens)[j].name() << " ";
00076 os << ")";
00077 }
00078 }
00079 os << "]";
00080 }
00081
00082 void EbnfOrNode::dump (ostream &os) const
00083 {
00084 if (laSpec != NULL) laSpec->dump(os);
00085 if (!startCode.empty()) os << "{" << startCode.code << "}";
00086 os << "(";
00087 pre->dump(os);
00088 os << " | ";
00089 post->dump(os);
00090 os << ")";
00091 dumpAttributes(os);
00092 if (!endCode.empty()) os << "{" << endCode.code << "}";
00093 }
00094
00095
00096 void EbnfCatNode::dump (ostream &os) const
00097 {
00098 if (laSpec != NULL) laSpec->dump(os);
00099 if (!startCode.empty()) os << "{" << startCode.code << "}";
00100 os << "(";
00101 pre->dump(os);
00102 os << " . ";
00103 post->dump(os);
00104 os << ")";
00105 dumpAttributes(os);
00106 if (!endCode.empty()) os << "{" << endCode.code << "}";
00107 }
00108
00109
00110 void EbnfStarNode::dump (ostream &os) const
00111 {
00112 if (laSpec != NULL) laSpec->dump(os);
00113 if (!startCode.empty()) os << "{" << startCode.code << "}";
00114 os << "(";
00115 in->dump(os);
00116 os << ")*";
00117 dumpAttributes(os);
00118 if (!endCode.empty()) os << "{" << endCode.code << "}";
00119 }
00120
00121
00122 void EbnfNonterminalNode::dump (ostream &os) const
00123 {
00124 if (laSpec != NULL) laSpec->dump(os);
00125 if (!startCode.empty()) os << "{" << startCode.code << "}";
00126 os << "(";
00127 if (!targetVar.empty()) os << targetVar.code << " = ";
00128 os << nontermName << "(" << actualArgs.code << ")";
00129 os << ")";
00130 dumpAttributes(os);
00131 if (!endCode.empty()) os << "{" << endCode.code << "}";
00132 }
00133
00134
00135 void EbnfTerminalNode::dump (ostream &os) const
00136 {
00137 if (laSpec != NULL) laSpec->dump(os);
00138 if (!startCode.empty()) os << "{" << startCode.code << "}";
00139 os << "( ";
00140 os << "<" << terminal.name() << "> ";
00141 os << ")";
00142 dumpAttributes(os);
00143 if (!endCode.empty()) os << "{" << endCode.code << "}";
00144 }
00145
00146
00147 void EbnfLambdaNode::dump (ostream &os) const
00148 {
00149 os << "nil";
00150 dumpAttributes(os);
00151 }
00152
00153 #endif