1
我正在嘗試編寫一個解析器,它使用Variable-Declaration和-Instantiations讀入文本文件,並構造一個Variable-Table,其中包含所有聲明的變量及其關聯的值。規則屬性的兼容性
文件如下所示:
int a = 18, b = 1+a*5;
float test = rand(a);
要做到這一點,我想使用升壓::精神::氣解析庫,提供了一個動態符號表解析器可以象徵關聯一個可變數據類型T. 提供的符號表分析器的不足之處在於,它只能將其符號與一個數據類型的值相關聯。
我有以下代碼:
#include <boost/spirit/include/qi.hpp>
#include <stdint.h>
#include <string>
template<typename VTYPE>
struct VTable : boost::spirit::qi::symbols<char, VTYPE> {
VTable() {} // empty
};
int main()
{
using boost::spirit::qi::rule;
using boost::spirit::qi::space_type;
VTable<int64_t> intDecs; VTable<double> floatDecs;
rule<std::string::iterator, boost::variant<int64_t, double>() ,space_type> decs %= (!floatDecs >> intDecs) | floatDecs;
return 0;
}
問題在於return語句之前一行。 '%='左側的屬性顯然與右側的屬性不兼容(因爲Visual Studio正在抱怨該代碼)。
我的問題是,爲什麼這樣呢?
當我讀精神的文檔::齊它下面說一下解析器屬性:
- 符號< CHAR,T>的屬性類型是intDecs的T.
=>屬性類型應是int64_t()和floatDecs的屬性類型應爲double() - 解析器!a的屬性類型未使用。
- 如果解析器X的屬性類型未使用,並且paser Y是T,那麼解析器(X >> Y)的屬性類型是T.
=>屬性類型(!floatDecs >> intDecs)應該是int64_t() - 如果解析器a的屬性類型是A,解析器b的屬性類型是B,那麼解析器(a | b)的屬性類型是boost :: variant()
屬性類型(!floatDecs >> intDecs)| floatDecs)應該是boost :: variant()