Beispiel #1
0
/*--------------------------------------------------------------------------------------------------
  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;
}
Beispiel #2
0
// 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;
}
Beispiel #3
0
/*--------------------------------------------------------------------------------------------------
  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;
}
Beispiel #4
0
// 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;
}