tuple<Token::Value, unsigned int, unsigned int> Token::fromIdentifierOrKeyword(string const& _literal) { auto positionM = find_if(_literal.begin(), _literal.end(), ::isdigit); if (positionM != _literal.end()) { string baseType(_literal.begin(), positionM); auto positionX = find_if_not(positionM, _literal.end(), ::isdigit); int m = parseSize(positionM, positionX); Token::Value keyword = keywordByName(baseType); if (keyword == Token::Bytes) { if (0 < m && m <= 32 && positionX == _literal.end()) return make_tuple(Token::BytesM, m, 0); } else if (keyword == Token::UInt || keyword == Token::Int) { if (0 < m && m <= 256 && m % 8 == 0 && positionX == _literal.end()) { if (keyword == Token::UInt) return make_tuple(Token::UIntM, m, 0); else return make_tuple(Token::IntM, m, 0); } } else if (keyword == Token::UFixed || keyword == Token::Fixed) { if ( positionM < positionX && positionX < _literal.end() && *positionX == 'x' && all_of(positionX + 1, _literal.end(), ::isdigit) ) { int n = parseSize(positionX + 1, _literal.end()); if ( 0 <= m && m <= 256 && 8 <= n && n <= 256 && m + n > 0 && m + n <= 256 && m % 8 == 0 && n % 8 == 0 ) { if (keyword == Token::UFixed) return make_tuple(Token::UFixedMxN, m, n); else return make_tuple(Token::FixedMxN, m, n); } } } return make_tuple(Token::Identifier, 0, 0); } return make_tuple(keywordByName(_literal), 0, 0); }
HaxeMessageSyntax::HaxeMessageSyntax() { DEFINE_VOID("SpaceChar", RANGE(" \n\r\t")); DEFINE_VOID("Whitespace", REPEAT(INLINE("SpaceChar"))); specialChar_ = DEFINE("SpecialChar", GLUE( CHAR('&'), KEYWORD("gt lt"), CHAR(';') ) ); gt_ = keywordByName("gt"); lt_ = keywordByName("lt"); value_ = DEFINE("Value", REPEAT(1, CHOICE( REF("SpecialChar"), GLUE( NOT( GLUE( INLINE("Whitespace"), CHAR('<') ) ), ANY() ) ) ) ); typeTip_ = DEFINE("TypeTip", GLUE( STRING("<type>"), INLINE("Whitespace"), REF("Value"), INLINE("Whitespace"), STRING("</type>") ) ); memberName_ = DEFINE("MemberName", REPEAT(1, OTHER('\"'))); memberType_ = DEFINE("MemberType", REPEAT(0, 1, INLINE("Value"))); memberDescription_ = DEFINE("MemberDescription", REPEAT(0, 1, INLINE("Value"))); member_ = DEFINE("Member", GLUE( STRING("<i n=\""), REF("MemberName"), STRING("\"><t>"), REF("MemberType"), STRING("</t><d>"), REF("MemberDescription"), STRING("</d></i>") ) ); membersTip_ = DEFINE("MembersTip", GLUE( STRING("<list>"), REPEAT(1, GLUE( INLINE("Whitespace"), REF("Member") ) ), INLINE("Whitespace"), STRING("</list>") ) ); haxeTip_ = DEFINE("HaxeTip", FIND( GLUE( INLINE("Whitespace"), CHOICE( REF("TypeTip"), REF("MembersTip") ), INLINE("Whitespace") ) ) ); ENTRY("HaxeTip"); }