Mercurial > ~dholland > hg > ag > index.cgi
diff anagram/agcore/token.cpp @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children | 607e3be6bad8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/anagram/agcore/token.cpp Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,155 @@ +/* + * AnaGram, A System for Syntax Directed Programming + * Copyright 1993-2002 Parsifal Software. All Rights Reserved. + * See the file COPYING for license and usage terms. + * + * token.cpp + */ + +#include "q1glbl.h" +#include "rule.h" +#include "token.h" + +//#define INCLUDE_LOGGING +#include "log.h" + + +Token::Map map_token_number; +const int Token::first = 1; + +token_number_map &Token::Map::operator [] (unsigned x) { + //LOGSECTION("Token::Map::operator []"); + //LOGV(x) LCV(Token::descriptorList.size()); + assert(x < Token::descriptorList.size()); + return Token::descriptorList[x]; +} + +token_number_map::token_number_map() + : key() + , vp_prod_number(0) + , value_type(0) + //, value_type(void_token_type) + , token_set_id(0) + , part_number(0) + , precedence_level(0) + , sticky(0) + , zero_length_flag(0) + , non_terminal_flag(0) + , sem_det_flag(0) + , fine_structure(0) + , left_associative(0) + , right_associative(0) + , rp_arg(0) + , pure(0) + , junky(0) + , reserve(0) + , reserved_word(0) + , subgrammar(0) + , lexeme(0) + , lexical(0) + , immediate_action(0) + , operatorCandidate(0) + , disregard(0) +{ + LOGSECTION("token_number_map::token_number_map"); +} + +Token::Token(int x) : ObjectRegister<token_number_map>(x) {} +Token::Token(const Token &t) : ObjectRegister<token_number_map>(t) {} + + +Token Token::create() { + LOGSECTION("Token::create"); + ntkns = descriptorList.size(); + descriptorList.push(token_number_map()); + //LOGV(netAllocations()); + Token token(ntkns); + //LOGV(netAllocations()); + LOGV(token) LCV(ntkns) LCV(descriptorList.size()) + LCV(token->value_type) LCV(token->token_name); + return token; +} + +void Token::reset() { + LOGSECTION("Token::reset"); + ntkns = descriptorList.size(); + descriptorList.reset().push(token_number_map()); + LOGV(ntkns) LCV(descriptorList.size()); +} + +Rule Token::rule(int x) const { + //return descriptorList[index].rule(x); + return descriptor->ruleList[x]; +} + +Rule Token::expansionRule(int x) const { + //return descriptorList[index].expansionRule(x); + return descriptor->expansionRuleList[x]; +} + +Token Token::follower(int x) const { + return descriptor->followerList[x]; +} + +Token Token::leadingToken(int x) const { + return descriptor->leadingTokenList[x]; +} + +int Token::isLeadingToken(const Token candidate) const { + LOGSECTION("Token::isLeadingToken"); + LOGV(index) LCV(candidate.index); + + int nt; + + if (index == candidate.index) { + return 1; + } + + AgArray<Token> leadingTokenList = descriptor->leadingTokenList; + nt = leadingTokenList.size(); + LOGV(nt); + + while (nt--) { + LOGV(index) LCV(leadingTokenList[nt].index); + if (candidate.index == leadingTokenList[nt].index) { + return 1; + } + } + + return 0; +} + +int Token::isExpansionToken(const Token candidate) const { + int nf; + + if (index == candidate.index) { + return 1; + } + + //token_number_map &descriptor = descriptorList[index]; + nf = descriptor->expansionRuleList.size(); + for (int i = 0; i < nf; i++) { + Rule rule = descriptor->expansionRuleList[i]; + int k = rule->length(); + if (k == 0) { + continue; + } + if (candidate == rule.token(0)) { + return 1; + } + } + return 0; +} + +int Token::isExpansionRule(const Rule rule) const { + //token_number_map &descriptor = descriptorList[index]; + unsigned nf = descriptor->expansionRuleList.size(); + + while (nf--) { + if (descriptor->expansionRuleList[nf] == rule) { + return 1; + } + } + + return 0; +}