--- c.c +++ c.c @@ -61,35 +61,39 @@ */ typedef enum eKeywordId { KEYWORD_NONE = -1, - KEYWORD_ATTRIBUTE, KEYWORD_ABSTRACT, - KEYWORD_BOOLEAN, KEYWORD_BYTE, KEYWORD_BAD_STATE, KEYWORD_BAD_TRANS, - KEYWORD_BIND, KEYWORD_BIND_VAR, KEYWORD_BIT, + KEYWORD_ATTRIBUTE, KEYWORD_ABSTRACT, KEYWORD_ANY, + KEYWORD_BOOLEAN, KEYWORD_BYTE, KEYWORD_BYTEBLOCK, KEYWORD_BAD_STATE, + KEYWORD_BAD_TRANS, + KEYWORD_BIND, KEYWORD_BIND_VAR, KEYWORD_BIT, KEYWORD_BLOCK, KEYWORD_CASE, KEYWORD_CATCH, KEYWORD_CHAR, KEYWORD_CLASS, KEYWORD_CONST, KEYWORD_CONSTRAINT, KEYWORD_COVERAGE_BLOCK, KEYWORD_COVERAGE_DEF, - KEYWORD_DEFAULT, KEYWORD_DELEGATE, KEYWORD_DELETE, KEYWORD_DO, + KEYWORD_DEFAULT, KEYWORD_DECLARATION, KEYWORD_DELEGATE, KEYWORD_DELETE, + KEYWORD_DO, KEYWORD_DOUBLE, - KEYWORD_ELSE, KEYWORD_ENUM, KEYWORD_EXPLICIT, KEYWORD_EXTERN, + KEYWORD_ELSE, KEYWORD_ENUM, KEYWORD_EXPLICIT, KEYWORD_EXPRESSION, + KEYWORD_EXTERN, KEYWORD_EXTENDS, KEYWORD_EVENT, KEYWORD_FINAL, KEYWORD_FLOAT, KEYWORD_FOR, KEYWORD_FRIEND, KEYWORD_FUNCTION, KEYWORD_GOTO, KEYWORD_IF, KEYWORD_IMPLEMENTS, KEYWORD_IMPORT, KEYWORD_INLINE, KEYWORD_INT, KEYWORD_INOUT, KEYWORD_INPUT, KEYWORD_INTEGER, KEYWORD_INTERFACE, KEYWORD_INTERNAL, - KEYWORD_LOCAL, KEYWORD_LONG, + KEYWORD_LIST, KEYWORD_LOCAL, KEYWORD_LOCALE, KEYWORD_LONG, KEYWORD_M_BAD_STATE, KEYWORD_M_BAD_TRANS, KEYWORD_M_STATE, KEYWORD_M_TRANS, - KEYWORD_MUTABLE, + KEYWORD_MAP, KEYWORD_MUTABLE, KEYWORD_NAMESPACE, KEYWORD_NEW, KEYWORD_NEWCOV, KEYWORD_NATIVE, KEYWORD_OPERATOR, KEYWORD_OUTPUT, KEYWORD_OVERLOAD, KEYWORD_OVERRIDE, - KEYWORD_PACKED, KEYWORD_PORT, KEYWORD_PACKAGE, KEYWORD_PRIVATE, - KEYWORD_PROGRAM, KEYWORD_PROTECTED, KEYWORD_PUBLIC, + KEYWORD_PACKED, KEYWORD_PATH, KEYWORD_PORT, KEYWORD_PACKAGE, + KEYWORD_PRIVATE, + KEYWORD_PROGRAM, KEYWORD_PROTECTED, KEYWORD_PUBLIC, KEYWORD_REPEAT, KEYWORD_REGISTER, KEYWORD_RETURN, KEYWORD_SHADOW, KEYWORD_STATE, KEYWORD_SHORT, KEYWORD_SIGNED, KEYWORD_STATIC, KEYWORD_STRING, - KEYWORD_STRUCT, KEYWORD_SWITCH, KEYWORD_SYNCHRONIZED, - KEYWORD_TASK, KEYWORD_TEMPLATE, KEYWORD_THIS, KEYWORD_THROW, + KEYWORD_STRUCT, KEYWORD_SWITCH, KEYWORD_SYNCHRONIZED, KEYWORD_SYMBOL, + KEYWORD_TASK, KEYWORD_TEMPLATE, KEYWORD_TERM, KEYWORD_THIS, KEYWORD_THROW, KEYWORD_THROWS, KEYWORD_TRANSIENT, KEYWORD_TRANS, KEYWORD_TRANSITION, KEYWORD_TRY, KEYWORD_TYPEDEF, KEYWORD_TYPENAME, - KEYWORD_UINT, KEYWORD_ULONG, KEYWORD_UNION, KEYWORD_UNSIGNED, KEYWORD_USHORT, + KEYWORD_UINT, KEYWORD_ULONG, KEYWORD_UNION, KEYWORD_UNSIGNED, KEYWORD_UNTIL, KEYWORD_USHORT, KEYWORD_USING, KEYWORD_VIRTUAL, KEYWORD_VOID, KEYWORD_VOLATILE, KEYWORD_WCHAR_T, KEYWORD_WHILE @@ -101,7 +105,7 @@ typedef struct sKeywordDesc { const char *name; keywordId id; - short isValid [5]; /* indicates languages for which kw is valid */ + short isValid [6]; /* indicates languages for which kw is valid */ } keywordDesc; /* Used for reporting the type of object parsed by nextToken (). @@ -137,6 +141,7 @@ typedef enum eDeclaration { DECL_NONE, DECL_BASE, /* base type (default) */ + DECL_BLOCK, /* YCP unnamed block */ DECL_CLASS, DECL_ENUM, DECL_EVENT, @@ -258,6 +263,7 @@ static langType Lang_csharp; static langType Lang_java; static langType Lang_vera; +static langType Lang_ycp; static vString *Signature; static boolean CollectingSignature; @@ -354,110 +360,138 @@ { FALSE, 'x', "externvar", "external variable declarations"} }; +/* Used to index into the YCPKinds table. */ +typedef enum { + YK_UNDEFINED = -1, + YK_FUNCTION, YK_PROTOTYPE, + YK_LOCAL, + YK_VARIABLE +} ycpKind; + +static kindOption YCPKinds [] = { + { TRUE, 'f', "function", "function definitions"}, + { FALSE, 'p', "prototype", "function prototypes"}, + { FALSE, 'l', "local", "local variables"}, + { TRUE, 'v', "variable", "variable definitions"}, +}; + static const keywordDesc KeywordTable [] = { - /* C++ */ - /* ANSI C | C# Java */ - /* | | | | Vera */ - /* keyword keyword ID | | | | | */ - { "__attribute__", KEYWORD_ATTRIBUTE, { 1, 1, 1, 0, 0 } }, - { "abstract", KEYWORD_ABSTRACT, { 0, 0, 1, 1, 0 } }, - { "bad_state", KEYWORD_BAD_STATE, { 0, 0, 0, 0, 1 } }, - { "bad_trans", KEYWORD_BAD_TRANS, { 0, 0, 0, 0, 1 } }, - { "bind", KEYWORD_BIND, { 0, 0, 0, 0, 1 } }, - { "bind_var", KEYWORD_BIND_VAR, { 0, 0, 0, 0, 1 } }, - { "bit", KEYWORD_BIT, { 0, 0, 0, 0, 1 } }, - { "boolean", KEYWORD_BOOLEAN, { 0, 0, 0, 1, 0 } }, - { "byte", KEYWORD_BYTE, { 0, 0, 0, 1, 0 } }, - { "case", KEYWORD_CASE, { 1, 1, 1, 1, 0 } }, - { "catch", KEYWORD_CATCH, { 0, 1, 1, 0, 0 } }, - { "char", KEYWORD_CHAR, { 1, 1, 1, 1, 0 } }, - { "class", KEYWORD_CLASS, { 0, 1, 1, 1, 1 } }, - { "const", KEYWORD_CONST, { 1, 1, 1, 1, 0 } }, - { "constraint", KEYWORD_CONSTRAINT, { 0, 0, 0, 0, 1 } }, - { "coverage_block", KEYWORD_COVERAGE_BLOCK, { 0, 0, 0, 0, 1 } }, - { "coverage_def", KEYWORD_COVERAGE_DEF, { 0, 0, 0, 0, 1 } }, - { "do", KEYWORD_DO, { 1, 1, 1, 1, 0 } }, - { "default", KEYWORD_DEFAULT, { 1, 1, 1, 1, 0 } }, - { "delegate", KEYWORD_DELEGATE, { 0, 0, 1, 0, 0 } }, - { "delete", KEYWORD_DELETE, { 0, 1, 0, 0, 0 } }, - { "double", KEYWORD_DOUBLE, { 1, 1, 1, 1, 0 } }, - { "else", KEYWORD_ELSE, { 1, 1, 0, 1, 0 } }, - { "enum", KEYWORD_ENUM, { 1, 1, 1, 0, 1 } }, - { "event", KEYWORD_EVENT, { 0, 0, 1, 0, 1 } }, - { "explicit", KEYWORD_EXPLICIT, { 0, 1, 1, 0, 0 } }, - { "extends", KEYWORD_EXTENDS, { 0, 0, 0, 1, 1 } }, - { "extern", KEYWORD_EXTERN, { 1, 1, 1, 0, 1 } }, - { "final", KEYWORD_FINAL, { 0, 0, 0, 1, 0 } }, - { "float", KEYWORD_FLOAT, { 1, 1, 1, 1, 0 } }, - { "for", KEYWORD_FOR, { 1, 1, 1, 1, 0 } }, - { "friend", KEYWORD_FRIEND, { 0, 1, 0, 0, 0 } }, - { "function", KEYWORD_FUNCTION, { 0, 0, 0, 0, 1 } }, - { "goto", KEYWORD_GOTO, { 1, 1, 1, 1, 0 } }, - { "if", KEYWORD_IF, { 1, 1, 1, 1, 0 } }, - { "implements", KEYWORD_IMPLEMENTS, { 0, 0, 0, 1, 0 } }, - { "import", KEYWORD_IMPORT, { 0, 0, 0, 1, 0 } }, - { "inline", KEYWORD_INLINE, { 0, 1, 0, 0, 0 } }, - { "inout", KEYWORD_INOUT, { 0, 0, 0, 0, 1 } }, - { "input", KEYWORD_INPUT, { 0, 0, 0, 0, 1 } }, - { "int", KEYWORD_INT, { 1, 1, 1, 1, 0 } }, - { "integer", KEYWORD_INTEGER, { 0, 0, 0, 0, 1 } }, - { "interface", KEYWORD_INTERFACE, { 0, 0, 1, 1, 1 } }, - { "internal", KEYWORD_INTERNAL, { 0, 0, 1, 0, 0 } }, - { "local", KEYWORD_LOCAL, { 0, 0, 0, 0, 1 } }, - { "long", KEYWORD_LONG, { 1, 1, 1, 1, 0 } }, - { "m_bad_state", KEYWORD_M_BAD_STATE, { 0, 0, 0, 0, 1 } }, - { "m_bad_trans", KEYWORD_M_BAD_TRANS, { 0, 0, 0, 0, 1 } }, - { "m_state", KEYWORD_M_STATE, { 0, 0, 0, 0, 1 } }, - { "m_trans", KEYWORD_M_TRANS, { 0, 0, 0, 0, 1 } }, - { "mutable", KEYWORD_MUTABLE, { 0, 1, 0, 0, 0 } }, - { "namespace", KEYWORD_NAMESPACE, { 0, 1, 1, 0, 0 } }, - { "native", KEYWORD_NATIVE, { 0, 0, 0, 1, 0 } }, - { "new", KEYWORD_NEW, { 0, 1, 1, 1, 0 } }, - { "newcov", KEYWORD_NEWCOV, { 0, 0, 0, 0, 1 } }, - { "operator", KEYWORD_OPERATOR, { 0, 1, 1, 0, 0 } }, - { "output", KEYWORD_OUTPUT, { 0, 0, 0, 0, 1 } }, - { "overload", KEYWORD_OVERLOAD, { 0, 1, 0, 0, 0 } }, - { "override", KEYWORD_OVERRIDE, { 0, 0, 1, 0, 0 } }, - { "package", KEYWORD_PACKAGE, { 0, 0, 0, 1, 0 } }, - { "packed", KEYWORD_PACKED, { 0, 0, 0, 0, 1 } }, - { "port", KEYWORD_PORT, { 0, 0, 0, 0, 1 } }, - { "private", KEYWORD_PRIVATE, { 0, 1, 1, 1, 0 } }, - { "program", KEYWORD_PROGRAM, { 0, 0, 0, 0, 1 } }, - { "protected", KEYWORD_PROTECTED, { 0, 1, 1, 1, 1 } }, - { "public", KEYWORD_PUBLIC, { 0, 1, 1, 1, 1 } }, - { "register", KEYWORD_REGISTER, { 1, 1, 0, 0, 0 } }, - { "return", KEYWORD_RETURN, { 1, 1, 1, 1, 0 } }, - { "shadow", KEYWORD_SHADOW, { 0, 0, 0, 0, 1 } }, - { "short", KEYWORD_SHORT, { 1, 1, 1, 1, 0 } }, - { "signed", KEYWORD_SIGNED, { 1, 1, 0, 0, 0 } }, - { "state", KEYWORD_STATE, { 0, 0, 0, 0, 1 } }, - { "static", KEYWORD_STATIC, { 1, 1, 1, 1, 1 } }, - { "string", KEYWORD_STRING, { 0, 0, 1, 0, 1 } }, - { "struct", KEYWORD_STRUCT, { 1, 1, 1, 0, 0 } }, - { "switch", KEYWORD_SWITCH, { 1, 1, 1, 1, 0 } }, - { "synchronized", KEYWORD_SYNCHRONIZED, { 0, 0, 0, 1, 0 } }, - { "task", KEYWORD_TASK, { 0, 0, 0, 0, 1 } }, - { "template", KEYWORD_TEMPLATE, { 0, 1, 0, 0, 0 } }, - { "this", KEYWORD_THIS, { 0, 1, 1, 1, 0 } }, - { "throw", KEYWORD_THROW, { 0, 1, 1, 1, 0 } }, - { "throws", KEYWORD_THROWS, { 0, 0, 0, 1, 0 } }, - { "trans", KEYWORD_TRANS, { 0, 0, 0, 0, 1 } }, - { "transition", KEYWORD_TRANSITION, { 0, 0, 0, 0, 1 } }, - { "transient", KEYWORD_TRANSIENT, { 0, 0, 0, 1, 0 } }, - { "try", KEYWORD_TRY, { 0, 1, 1, 0, 0 } }, - { "typedef", KEYWORD_TYPEDEF, { 1, 1, 1, 0, 1 } }, - { "typename", KEYWORD_TYPENAME, { 0, 1, 0, 0, 0 } }, - { "uint", KEYWORD_UINT, { 0, 0, 1, 0, 0 } }, - { "ulong", KEYWORD_ULONG, { 0, 0, 1, 0, 0 } }, - { "union", KEYWORD_UNION, { 1, 1, 0, 0, 0 } }, - { "unsigned", KEYWORD_UNSIGNED, { 1, 1, 1, 0, 0 } }, - { "ushort", KEYWORD_USHORT, { 0, 0, 1, 0, 0 } }, - { "using", KEYWORD_USING, { 0, 1, 1, 0, 0 } }, - { "virtual", KEYWORD_VIRTUAL, { 0, 1, 1, 0, 1 } }, - { "void", KEYWORD_VOID, { 1, 1, 1, 1, 1 } }, - { "volatile", KEYWORD_VOLATILE, { 1, 1, 1, 1, 0 } }, - { "wchar_t", KEYWORD_WCHAR_T, { 1, 1, 1, 0, 0 } }, - { "while", KEYWORD_WHILE, { 1, 1, 1, 1, 0 } } + /* C++ YCP */ + /* ANSI C | C# Java | */ + /* | | | | Vera */ + /* keyword keyword ID | | | | | | */ + { "__attribute__", KEYWORD_ATTRIBUTE, { 1, 1, 1, 0, 0, 0 } }, + { "abstract", KEYWORD_ABSTRACT, { 0, 0, 1, 1, 0, 0 } }, + { "any", KEYWORD_ANY, { 0, 0, 0, 0, 0, 1 } }, + { "bad_state", KEYWORD_BAD_STATE, { 0, 0, 0, 0, 1, 0 } }, + { "bad_trans", KEYWORD_BAD_TRANS, { 0, 0, 0, 0, 1, 0 } }, + { "bind", KEYWORD_BIND, { 0, 0, 0, 0, 1, 0 } }, + { "bind_var", KEYWORD_BIND_VAR, { 0, 0, 0, 0, 1, 0 } }, + { "bit", KEYWORD_BIT, { 0, 0, 0, 0, 1, 0 } }, + { "block", KEYWORD_BLOCK, { 0, 0, 0, 0, 0, 1 } }, + { "boolean", KEYWORD_BOOLEAN, { 0, 0, 0, 1, 0, 1 } }, + { "byte", KEYWORD_BYTE, { 0, 0, 0, 1, 0, 0 } }, + { "byteblock", KEYWORD_BYTEBLOCK, { 0, 0, 0, 0, 0, 1 } }, + { "case", KEYWORD_CASE, { 1, 1, 1, 1, 0, 0 } }, + { "catch", KEYWORD_CATCH, { 0, 1, 1, 0, 0, 0 } }, + { "char", KEYWORD_CHAR, { 1, 1, 1, 1, 0, 0 } }, + { "class", KEYWORD_CLASS, { 0, 1, 1, 1, 1, 0 } }, + { "const", KEYWORD_CONST, { 1, 1, 1, 1, 0, 0 } }, + { "constraint", KEYWORD_CONSTRAINT, { 0, 0, 0, 0, 1, 0 } }, + { "coverage_block", KEYWORD_COVERAGE_BLOCK, { 0, 0, 0, 0, 1, 0 } }, + { "coverage_def", KEYWORD_COVERAGE_DEF, { 0, 0, 0, 0, 1, 0 } }, + { "declaration", KEYWORD_DECLARATION, { 0, 0, 0, 0, 0, 1 } }, + { "do", KEYWORD_DO, { 1, 1, 1, 1, 0, 1 } }, + { "default", KEYWORD_DEFAULT, { 1, 1, 1, 1, 0, 0 } }, + { "delegate", KEYWORD_DELEGATE, { 0, 0, 1, 0, 0, 0 } }, + { "delete", KEYWORD_DELETE, { 0, 1, 0, 0, 0, 0 } }, + { "double", KEYWORD_DOUBLE, { 1, 1, 1, 1, 0, 0 } }, + { "else", KEYWORD_ELSE, { 1, 1, 0, 1, 0, 1 } }, + { "enum", KEYWORD_ENUM, { 1, 1, 1, 0, 1, 1 } }, + { "event", KEYWORD_EVENT, { 0, 0, 1, 0, 1, 0 } }, + { "explicit", KEYWORD_EXPLICIT, { 0, 1, 1, 0, 0, 0 } }, + { "expression", KEYWORD_EXPRESSION, { 0, 0, 0, 0, 0, 1 } }, + { "extends", KEYWORD_EXTENDS, { 0, 0, 0, 1, 1, 0 } }, + { "extern", KEYWORD_EXTERN, { 1, 1, 1, 0, 1, 0 } }, + { "final", KEYWORD_FINAL, { 0, 0, 0, 1, 0, 1 } }, + { "float", KEYWORD_FLOAT, { 1, 1, 1, 1, 0, 1 } }, + { "for", KEYWORD_FOR, { 1, 1, 1, 1, 0, 0 } }, + { "friend", KEYWORD_FRIEND, { 0, 1, 0, 0, 0, 0 } }, + { "function", KEYWORD_FUNCTION, { 0, 0, 0, 0, 1, 0 } }, + { "goto", KEYWORD_GOTO, { 1, 1, 1, 1, 0, 0 } }, + { "if", KEYWORD_IF, { 1, 1, 1, 1, 0, 1 } }, + { "implements", KEYWORD_IMPLEMENTS, { 0, 0, 0, 1, 0, 0 } }, + { "import", KEYWORD_IMPORT, { 0, 0, 0, 1, 0, 1 } }, + { "inline", KEYWORD_INLINE, { 0, 1, 0, 0, 0, 0 } }, + { "inout", KEYWORD_INOUT, { 0, 0, 0, 0, 1, 0 } }, + { "input", KEYWORD_INPUT, { 0, 0, 0, 0, 1, 0 } }, + { "int", KEYWORD_INT, { 1, 1, 1, 1, 0, 0 } }, + { "integer", KEYWORD_INTEGER, { 0, 0, 0, 0, 1, 1 } }, + { "interface", KEYWORD_INTERFACE, { 0, 0, 1, 1, 1, 0 } }, + { "internal", KEYWORD_INTERNAL, { 0, 0, 1, 0, 0, 0 } }, + { "list", KEYWORD_LIST, { 0, 0, 0, 0, 0, 1 } }, + { "local", KEYWORD_LOCAL, { 0, 0, 0, 0, 1, 0 } }, + { "locale", KEYWORD_LOCALE, { 0, 0, 0, 0, 0, 1 } }, + { "long", KEYWORD_LONG, { 1, 1, 1, 1, 0, 0 } }, + { "m_bad_state", KEYWORD_M_BAD_STATE, { 0, 0, 0, 0, 1, 0 } }, + { "m_bad_trans", KEYWORD_M_BAD_TRANS, { 0, 0, 0, 0, 1, 0 } }, + { "m_state", KEYWORD_M_STATE, { 0, 0, 0, 0, 1, 0 } }, + { "m_trans", KEYWORD_M_TRANS, { 0, 0, 0, 0, 1, 0 } }, + { "map", KEYWORD_MAP, { 0, 0, 0, 0, 0, 1 } }, + { "mutable", KEYWORD_MUTABLE, { 0, 1, 0, 0, 0, 0 } }, + { "namespace", KEYWORD_NAMESPACE, { 0, 1, 1, 0, 0, 0 } }, + { "native", KEYWORD_NATIVE, { 0, 0, 0, 1, 0, 0 } }, + { "new", KEYWORD_NEW, { 0, 1, 1, 1, 0, 0 } }, + { "newcov", KEYWORD_NEWCOV, { 0, 0, 0, 0, 1, 0 } }, + { "operator", KEYWORD_OPERATOR, { 0, 1, 1, 0, 0, 0 } }, + { "output", KEYWORD_OUTPUT, { 0, 0, 0, 0, 1, 0 } }, + { "overload", KEYWORD_OVERLOAD, { 0, 1, 0, 0, 0, 0 } }, + { "override", KEYWORD_OVERRIDE, { 0, 0, 1, 0, 0, 0 } }, + { "package", KEYWORD_PACKAGE, { 0, 0, 0, 1, 0, 0 } }, + { "packed", KEYWORD_PACKED, { 0, 0, 0, 0, 1, 0 } }, + { "path", KEYWORD_PATH, { 0, 0, 0, 0, 0, 1 } }, + { "port", KEYWORD_PORT, { 0, 0, 0, 0, 1, 0 } }, + { "private", KEYWORD_PRIVATE, { 0, 1, 1, 1, 0, 0 } }, + { "program", KEYWORD_PROGRAM, { 0, 0, 0, 0, 1, 0 } }, + { "protected", KEYWORD_PROTECTED, { 0, 1, 1, 1, 1, 0 } }, + { "public", KEYWORD_PUBLIC, { 0, 1, 1, 1, 1, 0 } }, + { "repeat", KEYWORD_REPEAT, { 0, 0, 0, 0, 0, 1 } }, + { "register", KEYWORD_REGISTER, { 1, 1, 0, 0, 0, 0 } }, + { "return", KEYWORD_RETURN, { 1, 1, 1, 1, 0, 1 } }, + { "shadow", KEYWORD_SHADOW, { 0, 0, 0, 0, 1, 0 } }, + { "short", KEYWORD_SHORT, { 1, 1, 1, 1, 0, 0 } }, + { "signed", KEYWORD_SIGNED, { 1, 1, 0, 0, 0, 0 } }, + { "state", KEYWORD_STATE, { 0, 0, 0, 0, 1, 0 } }, + { "static", KEYWORD_STATIC, { 1, 1, 1, 1, 1, 0 } }, + { "string", KEYWORD_STRING, { 0, 0, 1, 0, 1, 1 } }, + { "struct", KEYWORD_STRUCT, { 1, 1, 1, 0, 0, 0 } }, + { "switch", KEYWORD_SWITCH, { 1, 1, 1, 1, 0, 0 } }, + { "synchronized", KEYWORD_SYNCHRONIZED, { 0, 0, 0, 1, 0, 0 } }, + { "symbol", KEYWORD_SYMBOL, { 0, 0, 0, 0, 0, 1 } }, + { "task", KEYWORD_TASK, { 0, 0, 0, 0, 1, 0 } }, + { "template", KEYWORD_TEMPLATE, { 0, 1, 0, 0, 0, 0 } }, + { "term", KEYWORD_TERM, { 0, 0, 0, 0, 0, 1 } }, + { "this", KEYWORD_THIS, { 0, 1, 1, 1, 0, 0 } }, + { "throw", KEYWORD_THROW, { 0, 1, 1, 1, 0, 0 } }, + { "throws", KEYWORD_THROWS, { 0, 0, 0, 1, 0, 0 } }, + { "trans", KEYWORD_TRANS, { 0, 0, 0, 0, 1, 0 } }, + { "transition", KEYWORD_TRANSITION, { 0, 0, 0, 0, 1, 0 } }, + { "transient", KEYWORD_TRANSIENT, { 0, 0, 0, 1, 0, 0 } }, + { "try", KEYWORD_TRY, { 0, 1, 1, 0, 0, 0 } }, + { "typedef", KEYWORD_TYPEDEF, { 1, 1, 1, 0, 1, 0 } }, + { "typename", KEYWORD_TYPENAME, { 0, 1, 0, 0, 0, 0 } }, + { "uint", KEYWORD_UINT, { 0, 0, 1, 0, 0, 0 } }, + { "ulong", KEYWORD_ULONG, { 0, 0, 1, 0, 0, 0 } }, + { "union", KEYWORD_UNION, { 1, 1, 0, 0, 0, 0 } }, + { "unsigned", KEYWORD_UNSIGNED, { 1, 1, 1, 0, 0, 0 } }, + { "until", KEYWORD_UNTIL, { 0, 0, 0, 0, 0, 1 } }, + { "ushort", KEYWORD_USHORT, { 0, 0, 1, 0, 0, 0 } }, + { "using", KEYWORD_USING, { 0, 1, 1, 0, 0, 0 } }, + { "virtual", KEYWORD_VIRTUAL, { 0, 1, 1, 0, 1, 0 } }, + { "void", KEYWORD_VOID, { 1, 1, 1, 1, 1, 1 } }, + { "volatile", KEYWORD_VOLATILE, { 1, 1, 1, 1, 0, 0 } }, + { "wchar_t", KEYWORD_WCHAR_T, { 1, 1, 1, 0, 0, 0 } }, + { "while", KEYWORD_WHILE, { 1, 1, 1, 1, 0, 1 } } }; /* @@ -877,6 +911,21 @@ return result; } +static ycpKind ycpTagKind (const tagType type) +{ + ycpKind result = YK_UNDEFINED; + switch (type) + { + case TAG_FUNCTION: result = YK_FUNCTION; break; + case TAG_PROTOTYPE: result = YK_PROTOTYPE; break; + case TAG_LOCAL: result = YK_LOCAL; break; + case TAG_VARIABLE: result = YK_VARIABLE; break; + + default: Assert ("Bad YCP tag type" == NULL); break; + } + return result; +} + static const char *tagName (const tagType type) { const char* result; @@ -886,6 +935,8 @@ result = JavaKinds [javaTagKind (type)].name; else if (isLanguage (Lang_vera)) result = VeraKinds [veraTagKind (type)].name; + else if (isLanguage (Lang_ycp)) + result = YCPKinds [ycpTagKind (type)].name; else result = CKinds [cTagKind (type)].name; return result; @@ -900,6 +951,8 @@ result = JavaKinds [javaTagKind (type)].letter; else if (isLanguage (Lang_vera)) result = VeraKinds [veraTagKind (type)].letter; + else if (isLanguage (Lang_ycp)) + result = YCPKinds [ycpTagKind (type)].letter; else result = CKinds [cTagKind (type)].letter; return result; @@ -955,7 +1008,8 @@ static void addContextSeparator (vString *const scope) { - if (isLanguage (Lang_c) || isLanguage (Lang_cpp)) + if (isLanguage (Lang_c) || isLanguage (Lang_cpp) || + isLanguage (Lang_ycp)) vStringCatS (scope, "::"); else if (isLanguage (Lang_java) || isLanguage (Lang_csharp)) vStringCatS (scope, "."); @@ -1690,9 +1744,11 @@ case KEYWORD_NONE: processName (st); break; case KEYWORD_ABSTRACT: st->implementation = IMP_ABSTRACT; break; + case KEYWORD_ANY: st->declaration = DECL_BASE; break; case KEYWORD_ATTRIBUTE: skipParens (); initToken (token); break; case KEYWORD_BIND: st->declaration = DECL_BASE; break; case KEYWORD_BIT: st->declaration = DECL_BASE; break; + case KEYWORD_BYTEBLOCK: st->declaration = DECL_BASE; break; case KEYWORD_CATCH: skipParens (); skipBraces (); break; case KEYWORD_CHAR: st->declaration = DECL_BASE; break; case KEYWORD_CLASS: st->declaration = DECL_CLASS; break; @@ -1711,11 +1767,15 @@ case KEYWORD_INT: st->declaration = DECL_BASE; break; case KEYWORD_INTEGER: st->declaration = DECL_BASE; break; case KEYWORD_INTERFACE: st->declaration = DECL_INTERFACE; break; + case KEYWORD_LIST: st->declaration = DECL_BASE; break; case KEYWORD_LOCAL: setAccess (st, ACCESS_LOCAL); break; + case KEYWORD_LOCALE: st->declaration = DECL_BASE; break; case KEYWORD_LONG: st->declaration = DECL_BASE; break; + case KEYWORD_MAP: st->declaration = DECL_BASE; break; case KEYWORD_NAMESPACE: st->declaration = DECL_NAMESPACE; break; case KEYWORD_OPERATOR: readOperator (st); break; case KEYWORD_PACKAGE: readPackage (st); break; + case KEYWORD_PATH: st->declaration = DECL_BASE; break; case KEYWORD_PRIVATE: setAccess (st, ACCESS_PRIVATE); break; case KEYWORD_PROGRAM: st->declaration = DECL_PROGRAM; break; case KEYWORD_PROTECTED: setAccess (st, ACCESS_PROTECTED); break; @@ -1725,7 +1785,9 @@ case KEYWORD_SIGNED: st->declaration = DECL_BASE; break; case KEYWORD_STRING: st->declaration = DECL_BASE; break; case KEYWORD_STRUCT: st->declaration = DECL_STRUCT; break; + case KEYWORD_SYMBOL: st->declaration = DECL_BASE; break; case KEYWORD_TASK: st->declaration = DECL_TASK; break; + case KEYWORD_TERM: st->declaration = DECL_BASE; break; case KEYWORD_THROWS: discardTypeList (token); break; case KEYWORD_UNION: st->declaration = DECL_UNION; break; case KEYWORD_UNSIGNED: st->declaration = DECL_BASE; break; @@ -1764,7 +1826,9 @@ case KEYWORD_FOR: case KEYWORD_IF: + case KEYWORD_REPEAT: case KEYWORD_SWITCH: + case KEYWORD_UNTIL: case KEYWORD_WHILE: { int c = skipToNonWhite (); @@ -2253,7 +2317,8 @@ { if (vStringLength (st->context->name) > 0) { - if (isLanguage (Lang_c) || isLanguage (Lang_cpp)) + if (isLanguage (Lang_c) || isLanguage (Lang_cpp) || + isLanguage (Lang_ycp)) vStringCatS (st->context->name, "::"); else if (isLanguage (Lang_java) || isLanguage (Lang_csharp)) vStringCatS (st->context->name, "."); @@ -2569,7 +2634,12 @@ st->inFunction = TRUE; /* fall through */ default: - if (includeTag (TAG_LOCAL, FALSE)) + if (isLanguage (Lang_ycp) && ! st->haveQualifyingName) + { + st->declaration = DECL_BLOCK; + createTags (nestLevel, st); + } + else if (includeTag (TAG_LOCAL, FALSE)) createTags (nestLevel, st); else skipToMatch ("{}"); @@ -2610,6 +2680,7 @@ } } else if (isContextualStatement (st) || + st->declaration == DECL_BLOCK || st->declaration == DECL_NAMESPACE || st->declaration == DECL_PROGRAM) { @@ -2769,6 +2840,12 @@ buildKeywordHash (language, 4); } +static void initializeYcpParser (const langType language) +{ + Lang_ycp = language; + buildKeywordHash (language, 5); +} + extern parserDefinition* CParser (void) { static const char *const extensions [] = { "c", NULL }; @@ -2835,4 +2912,16 @@ return def; } +extern parserDefinition* YcpParser (void) +{ + static const char *const extensions [] = { "ycp", NULL }; + parserDefinition* def = parserNew ("YCP"); + def->kinds = YCPKinds; + def->kindCount = KIND_COUNT (YCPKinds); + def->extensions = extensions; + def->parser2 = findCTags; + def->initialize = initializeYcpParser; + return def; +} + /* vi:set tabstop=4 shiftwidth=4 noexpandtab: */ --- parsers.h +++ parsers.h @@ -48,7 +48,8 @@ VeraParser, \ VerilogParser, \ VimParser, \ - YaccParser + YaccParser, \ + YcpParser #endif /* _PARSERS_H */