/*-------------------------------------------------------------------------------------------------- Create a new property. --------------------------------------------------------------------------------------------------*/ dvProperty dvPropertyCreate( dvClass owningClass, dvUnion owningUnion, dvPropertyType type, utSym sym) { dvProperty property = dvClassFindProperty(owningClass, sym); if(property != dvPropertyNull) { utWarning("Property %s already exists on class %s", utSymGetName(sym), dvClassGetName(owningClass)); if(dvPropertyGetClass(property) != owningClass || dvPropertyGetUnion(property) != owningUnion || dvPropertyGetType(property) != type) { utError("Property %s defined differently the second time", utSymGetName(sym)); } return property; } property = dvPropertyAlloc(); dvPropertySetType(property, type); dvPropertySetSym(property, sym); dvClassAppendProperty(owningClass, property); if(owningUnion != dvUnionNull) { dvUnionAppendProperty(owningUnion, property); } return property; }
// Create a string value. coValue coStringValueCreate( utSym val) { coValue value = valueCreate(CO_STRING); coString string = coStringAlloc(); char *s = utSymGetName(val); coStringSetValue(string, s, strlen(s) + 1); coValueSetStringVal(value, string); return value; }
/*-------------------------------------------------------------------------------------------------- Build a new module object. --------------------------------------------------------------------------------------------------*/ dvModule dvModuleCreate( utSym sym, utSym prefix) { dvModule module = dvModuleAlloc(); utSym lowerPrefix; dvModuleSetSym(module, sym); if(prefix == utSymNull) { prefix = sym; } lowerPrefix = utSymCreate(utStringToLowerCase(utSymGetName(prefix))); dvModuleSetPrefixSym(module, lowerPrefix); dvRootAppendModule(dvTheRoot, module); return module; }
// Read one line of tokens. It is up to the caller to destroy these tokens. // Read up to a newline or a BEGIN token. static bool readOneLine(void) { printf("Reading one line\n"); paSyntax syntax; paStaterule staterule; paToken token; utSym subSyntaxSym; if(paNextBeginToken == paTokenNull) { token = paLex(); } else { token = paNextBeginToken; paNextBeginToken = paTokenNull; } if(token == paTokenNull) { return false; } // Now deal with BEGIN/END tokens. if(paTokenGetType(token) == PA_TOK_BEGIN) { printf("Starting sub-statements\n"); if(paPrevStatement == paStatementNull) { paError(token, "First line may not be intented"); } paOuterStatement = paPrevStatement; subSyntaxSym = paStateruleGetSubSyntaxSym(paStatementGetStaterule(paOuterStatement)); if(subSyntaxSym != utSymNull) { syntax = paRootFindSyntax(paTheRoot, subSyntaxSym); if(syntax != paSyntaxNull) { printf("Using syntax %s\n", paSyntaxGetName(syntax)); paCurrentSyntax = syntax; } else { paError(token, "Syntax %s not found", utSymGetName(subSyntaxSym)); } } paTokenDestroy(token); token = paLex(); if(paTokenGetType(token) == PA_TOK_NEWLINE) { paTokenDestroy(token); token = paLex(); } } while(token != paTokenNull && paTokenGetType(token) == PA_TOK_END) { printf("Finished sub-statements\n"); paOuterStatement = paStatementGetStatement(paOuterStatement); staterule = paStatementGetStaterule(paOuterStatement); if(staterule == paStateruleNull) { syntax = paTopSyntax; } else { syntax = paRootFindSyntax(paTheRoot, paStateruleGetSubSyntaxSym(staterule)); if(syntax == paSyntaxNull) { syntax = paStateruleGetSyntax(staterule); } } if(syntax != paCurrentSyntax) { printf("Using syntax %s\n", paSyntaxGetName(syntax)); paCurrentSyntax = syntax; } paTokenDestroy(token); token = paLex(); if(paTokenGetType(token) == PA_TOK_NEWLINE) { paTokenDestroy(token); token = paLex(); } } while(token != paTokenNull && paTokenGetType(token) != PA_TOK_NEWLINE && paTokenGetType(token) != PA_TOK_BEGIN) { if(paTokenGetType(token) == PA_TOK_CHAR) { // Every character should be matched by some other token paError(token, "Illegal character in input"); } paSyntaxAppendToken(paCurrentSyntax, token); paPrintToken(token); token = paLex(); } if(token != paTokenNull) { if(paTokenGetType(token) == PA_TOK_BEGIN) { paNextBeginToken = token; } else { paTokenDestroy(token); // We no longer need the NEWLINE token } } return paSyntaxGetUsedToken(paCurrentSyntax) > 0; }