PPI-XS-Tokenizer
view release on metacpan or search on metacpan
CPPTokenizerWrapper.cc view on Meta::CPAN
#include "CPPTokenizerWrapper.h"
#include "src/tokenizer.cpp"
#include "src/numbers.cpp"
#include "src/operator.cpp"
#include "src/quotes.cpp"
#include "src/structure.cpp"
#include "src/symbol.cpp"
#include "src/unknown.cpp"
#include "src/whitespace.cpp"
#include "src/word.cpp"
using namespace std;
namespace PPITokenizer {
/***********************************************************************/
const char* CPPTokenizerWrapper::fgTokenClasses[43] = {
"Token", // Token_NoType = 0,
"PPI::Token::Whitespace", // Token_WhiteSpace,
"PPI::Token::Symbol", // Token_Symbol,
"PPI::Token::Comment", // Token_Comment,
"PPI::Token::Word", // Token_Word,
"PPI::Token::DashedWord", // Token_DashedWord,
"PPI::Token::Structure", // Token_Structure,
"PPI::Token::Magic", // Token_Magic,
"PPI::Token::Number", // Token_Number,
"PPI::Token::Number::Version", // Token_Number_Version,
"PPI::Token::Number::Float", // Token_Number_Float,
"PPI::Token::Number::Hex", // Token_Number_Hex,
"PPI::Token::Number::Binary", // Token_Number_Binary,
"PPI::Token::Number::Octal", // Token_Number_Octal,
"PPI::Token::Number::Exp", // Token_Number_Exp,
"PPI::Token::Operator", // Token_Operator,
"PPI::Token::Operator", // Token_Operator_Attribute,
"PPI::Token::Unknown", // Token_Unknown,
"PPI::Token::Quote::Single", // Token_Quote_Single,
"PPI::Token::Quote::Double", // Token_Quote_Double,
"PPI::Token::Quote::Interpolate", // Token_Quote_Interpolate,
"PPI::Token::Quote::Literal", // Token_Quote_Literal,
"PPI::Token::QuoteLike::Backtick", // Token_QuoteLike_Backtick,
"PPI::Token::QuoteLike::Readline", // Token_QuoteLike_Readline,
"PPI::Token::QuoteLike::Command", // Token_QuoteLike_Command,
"PPI::Token::QuoteLike::Regexp", // Token_QuoteLike_Regexp,
"PPI::Token::QuoteLike::Words", // Token_QuoteLike_Words,
"PPI::Token::Regexp::Match", // Token_Regexp_Match,
"PPI::Token::Regexp::Match", // FIXME doesn't exist in PPI Token_Regexp_Match_Bare,
"PPI::Token::Regexp::Substitute", // Token_Regexp_Substitute,
"PPI::Token::Regexp::Transliterate", // Token_Regexp_Transliterate,
"PPI::Token::Cast", // Token_Cast,
"PPI::Token::Prototype", // Token_Prototype,
"PPI::Token::ArrayIndex", // Token_ArrayIndex,
"PPI::Token::HereDoc", // Token_HereDoc,
"PPI::Token::Attribute", // Token_Attribute,
"PPI::Token::Attribute", // Doesn't exist in PPI: Token_Attribute_Parameterized, (okay to map to PPI::Token::Attribute)
"PPI::Token::Label", // Token_Label,
"PPI::Token::Separator", // Token_Separator,
"PPI::Token::End", // Token_End,
"PPI::Token::Data", // Token_Data,
"PPI::Token::Pod", // Token_Pod,
"PPI::Token::BOM", // Token_BOM,
};
const int CPPTokenizerWrapper::fgSpecialToken[43] = {
eSimple, // Token_NoType = 0,
eSimple, // Token_WhiteSpace,
eSimple, // Token_Symbol,
eSimple, // Token_Comment,
eSimple, // Token_Word,
eSimple, // Token_DashedWord,
eSimple, // Token_Structure,
eSimple, // Token_Magic,
eSimple, // Token_Number,
eSimple, // Token_Number_Version,
eSimple, // Token_Number_Float,
eSimple, // Token_Number_Hex,
eSimple, // Token_Number_Binary,
eSimple, // Token_Number_Octal,
eSimple, // Token_Number_Exp,
eSimple, // Token_Operator,
eAttribute, // Token_Operator_Attribute,
eSimple, // Token_Unknown,
eQuoteSingle, // Token_Quote_Single,
eQuoteDouble, // Token_Quote_Double,
eExtended, // Token_Quote_Interpolate,
eExtended, // Token_Quote_Literal,
eBacktick, // Token_QuoteLike_Backtick,
eExtended, // Token_QuoteLike_Readline,
eExtended, // Token_QuoteLike_Command,
eExtended, // Token_QuoteLike_Regexp,
eExtended, // Token_QuoteLike_Words,
eExtended, // Token_Regexp_Match,
eExtended, // doesn't exist in PPI Token_Regexp_Match_Bare,
eExtended, // Token_Regexp_Substitute,
eExtended, // Token_Regexp_Transliterate,
eSimple, // Token_Cast,
eSimple, // Token_Prototype,
eSimple, // Token_ArrayIndex,
eHereDoc, // Token_HereDoc,
eSimple, // Token_Attribute,
eSimple, // Token_Attribute_Parameterized, (PPI::Token::Attribute)
eSimple, // Token_Label,
eSimple, // Token_Separator,
eSimple, // Token_End,
eSimple, // Token_Data,
eSimple, // Token_Pod,
eSimple, // Token_BOM,
};
/*
* special tokens:
* PPI::Token::HereDoc
* all "extended" tokens
*/
/***********************************************************************/
CPPTokenizerWrapper::CPPTokenizerWrapper(SV* source)
{
// Note: This is preprocessed to be \@lines in the Perl-land new()
fTokenizer = new Tokenizer();
SV* tmpSv;
if (!SvOK(source))
croak("Can't create PPI::XS::Tokenizer from an undefined source");
if (SvROK(source)) { // it's a reference
tmpSv = (SV*)SvRV(source);
// it's an array reference
if (SvTYPE(tmpSv) == SVt_PVAV) {
fLines = (AV*)tmpSv;
SvREFCNT_inc(fLines);
}
else
croak("Can only create PPI::XS::Tokenizer from a string, "
"a reference to a string or a reference to an array of lines");
}
else
croak("Can only create PPI::XS::Tokenizer from a string, "
"a reference to a string or a reference to an array of lines");
}
/***********************************************************************/
CPPTokenizerWrapper::~CPPTokenizerWrapper()
{
SvREFCNT_dec(fLines);
delete fTokenizer;
}
/***********************************************************************/
SV*
CPPTokenizerWrapper::get_token()
{
//printf("entering get token, num of lines=%d\n", av_len(fLines));
Token* theToken = fTokenizer->pop_one_token();
if (theToken == NULL) {
while (av_len(fLines) >= 0) {
SV* line = av_shift(fLines);
if (!SvOK(line) || !SvPOK(line)) {
SvREFCNT_dec(line); // FIXME check this
croak("Trying to tokenize undef line");
}
STRLEN len;
char* lineStr = S_stealPV(line, len);
//cout << "!"<<lineStr<<"!" << endl;
LineTokenizeResults res = fTokenizer->tokenizeLine(lineStr, len);
( run in 1.138 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )