1
0
mirror of https://github.com/twiglet/cs2j.git synced 2025-01-18 13:15:17 +01:00

add symbol table

This commit is contained in:
Kevin Glynn 2011-01-11 14:54:39 +01:00
parent 7a3229bf73
commit 1a23eafe90

View File

@ -77,6 +77,20 @@ scope SymTab {
return objectType; return objectType;
} }
} }
protected TypeRepTemplate SymTabLookup(string name) {
return SymTabLookup(name, null);
}
protected TypeRepTemplate SymTabLookup(string name, TypeRepTemplate def) {
object[] stabs = $SymTab.ToArray();
foreach(SymTab_scope stabScope in stabs) {
if (stabScope.symtab.ContainsKey(name)) {
return stabScope.symtab[name];
}
}
return def;
}
} }
compilation_unit compilation_unit
@ -128,15 +142,19 @@ class_member_declaration:
exception: exception:
EXCEPTION; EXCEPTION;
primary_expression: primary_expression returns [TypeRepTemplate dotNetType]:
^(INDEX expression expression_list?) ^(INDEX expression expression_list?)
| ^(APPLY identifier argument_list?) | ^(APPLY identifier argument_list?)
| ^(APPLY ^('.' expression identifier) argument_list?) | ^(APPLY ^('.' expression identifier) argument_list?)
// | ^(APPLY expression argument_list?) // | ^(APPLY expression argument_list?)
| ^(POSTINC expression) | ^(POSTINC expression)
| ^(POSTDEC expression) | ^(POSTDEC expression)
| primary_expression_start
| ^(access_operator expression type_or_generic) | ^(access_operator expression type_or_generic)
| predefined_type { $dotNetType = $predefined_type.dotNetType; }
| 'this' { $dotNetType = SymTabLookup("this"); }
| SUPER { $dotNetType = SymTabLookup("super"); }
| identifier { $dotNetType = SymTabLookup($identifier.thetext); }
| primary_expression_start
// ('this' brackets) => 'this' brackets primary_expression_part* // ('this' brackets) => 'this' brackets primary_expression_part*
// | ('base' brackets) => 'this' brackets primary_expression_part* // | ('base' brackets) => 'this' brackets primary_expression_part*
// | primary_expression_start primary_expression_part* // | primary_expression_start primary_expression_part*
@ -152,16 +170,12 @@ primary_expression:
| unchecked_expression // unchecked {...} | unchecked_expression // unchecked {...}
| default_value_expression // default | default_value_expression // default
| anonymous_method_expression // delegate (int foo) {} | anonymous_method_expression // delegate (int foo) {}
| typeof_expression // typeof(Foo).Name
; ;
primary_expression_start returns [TypeRepTemplate dotNetType]: primary_expression_start returns [TypeRepTemplate dotNetType]:
predefined_type { $dotNetType = $predefined_type.dotNetType; } (identifier generic_argument_list) => identifier generic_argument_list
| (identifier generic_argument_list) => identifier generic_argument_list
| identifier
| ^('::' identifier identifier) | ^('::' identifier identifier)
| 'this'
| SUPER
| typeof_expression // typeof(Foo).Name
| literal | literal
; ;
@ -404,7 +418,9 @@ pointer_type returns [TypeRepTemplate dotNetType]:
/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////
block block
scope SymTab; scope SymTab;
: @init {
$SymTab::symtab = new Dictionary<string,TypeRepTemplate>();
}:
';' ';'
| '{' statement_list? '}'; | '{' statement_list? '}';
statement_list: statement_list:
@ -639,14 +655,16 @@ scope NSContext,SymTab;
{ {
$NSContext::namespaces.Add($NSContext::currentNS); $NSContext::namespaces.Add($NSContext::currentNS);
$NSContext::globalNamespaces.Add($NSContext::currentNS); $NSContext::globalNamespaces.Add($NSContext::currentNS);
// TODO: base to map to parent type
ClassRepTemplate classTypeRep = (ClassRepTemplate)AppEnv.Search($NSContext::currentNS); ClassRepTemplate classTypeRep = (ClassRepTemplate)AppEnv.Search($NSContext::currentNS);
$SymTab::symtab["this"] = classTypeRep; $SymTab::symtab["this"] = classTypeRep;
ClassRepTemplate parent = ObjectType; ClassRepTemplate baseType = ObjectType;
if (classTypeRep.Inherits.Length > 0) { if (classTypeRep.Inherits != null && classTypeRep.Inherits.Length > 0) {
parent = (ClassRepTemplate)AppEnv.Search(classTypeRep.Uses, classTypeRep.Inherits[0], ObjectType) as ClassRepTemplate; // if Inherits[0] is a class tyhen it is parent, else system.object
ClassRepTemplate parent = (ClassRepTemplate)AppEnv.Search(classTypeRep.Uses, classTypeRep.Inherits[0], ObjectType) as ClassRepTemplate;
if (parent != null)
baseType = parent;
} }
$SymTab::symtab["super"] = parent; $SymTab::symtab["super"] = baseType;
} }
class_body ) ; class_body ) ;
@ -701,7 +719,9 @@ variable_declarator[TypeRepTemplate varType]:
/////////////////////////////////////////////////////// ///////////////////////////////////////////////////////
method_declaration method_declaration
scope SymTab; scope SymTab;
: @init {
$SymTab::symtab = new Dictionary<string,TypeRepTemplate>();
}:
method_header method_body ; method_header method_body ;
method_header: method_header:
^(METHOD_HEADER attributes? modifiers? type member_name type_parameter_constraints_clauses? type_parameter_list? formal_parameter_list?); ^(METHOD_HEADER attributes? modifiers? type member_name type_parameter_constraints_clauses? type_parameter_list? formal_parameter_list?);