まず第一に、C++の文法はLex/Bisonには複雑すぎると言いたいです。ここでの問題は、主に文法の競合にあります。それらを持たないC++文法を書くことはできません。C ++標準はこれを明示的に述べており、それらを解決する方法に関するいくつかのガイドラインが含まれています。
文法の矛盾を解決するための一般的な解決策はありません。特に、C ++の文法の競合を解決するには、すでに定義されている識別子に関する詳細な知識が必要です。これは、C++フロントエンドの大部分が必要であることを意味します。文法だけでは不十分です。
それにもかかわらず、ASTを構築することは可能です。小さなサンプルプログラムを見てください。
class HashEntry
{
private:
int key;
int value;
public:
HashEntry(int key, int value)
{
this->key = key;
this->value = value;
}
int getKey() { return key; }
int getValue() { return value; }
};
const int TABLE_SIZE = 128;
class HashMap
{
private:
HashEntry **table;
public:
HashMap()
{
table = new HashEntry*[TABLE_SIZE];
for (int i = 0; i < TABLE_SIZE; i++)
table[i] = NULL;
}
int get(int key)
{
int hash = (key % TABLE_SIZE);
while (table[hash] != NULL && table[hash]->getKey() != key)
hash = (hash + 1) % TABLE_SIZE;
if (table[hash] == NULL)
return -1;
else
return table[hash]->getValue();
}
void put(int key, int value)
{
int hash = (key % TABLE_SIZE);
while (table[hash] != NULL && table[hash]->getKey() != key)
hash = (hash + 1) % TABLE_SIZE;
if (table[hash] != NULL)
delete table[hash];
table[hash] = new HashEntry(key, value);
}
~HashMap()
{
for (int i = 0; i < TABLE_SIZE; i++)
if (table[i] != NULL)
delete table[i];
delete[] table;
}
};
そして、これはこのプログラムのASTです。
このツリーは大幅にズームアウトされています。葉の黄色い円(非常に小さい)は終端記号であり、中央の緑色の円は非終端記号です。中央のピンクの円はTranslationUnitです。このツリーには2009ノードがあります。