📄 cs.atg
字号:
using System.Drawing;
using System.Collections;
using System.Collections.Specialized;
using System.Text;
using ICSharpCode.SharpRefactory.Parser;
using ICSharpCode.SharpRefactory.Parser.AST;
COMPILER CS /* AW 2002-12-30 renamed from CompilationUnit to CS */
string assemblyName = null;
public CompilationUnit compilationUnit;
public string ContainingAssembly {
set {
assemblyName = value;
}
}
Token t {
get {
return lexer.Token;
}
}
Token la {
get {
return lexer.LookAhead;
}
}
Hashtable typeStrings = null;
ArrayList usingNamespaces = null;
public void Error(string s)
{
if (errDist >= minErrDist) {
errors.Error(la.line, la.col, s);
}
errDist = 0;
}
public Expression ParseExpression(Lexer lexer)
{
this.errors = lexer.Errors;
this.lexer = lexer;
errors.SynErr = new ErrorCodeProc(SynErr);
lexer.NextToken();
Expression expr;
Expr(out expr);
return expr;
}
bool IsTypeCast()
{
if (IsSimpleTypeCast()) {
return true;
}
if (assemblyName != null) {
return CheckTypeCast();
}
return GuessTypeCast();
}
bool IsSimpleTypeCast()
{
// check: "(" pointer or array of keyword type ")"
if (la.kind != Tokens.OpenParenthesis) {
return false;
}
StartPeek();
Token pt1 = Peek();
Token pt = Peek();
return ParserUtil.IsTypeKW(pt1) && IsPointerOrDims(ref pt) &&
pt.kind == Tokens.CloseParenthesis;
}
bool CheckTypeCast()
{
// check: leading "(" pointer or array of some type ")"
if (la.kind != Tokens.OpenParenthesis) {
return false;
}
string qualident;
StartPeek();
Token pt = Peek();
return IsQualident(ref pt, out qualident) && IsPointerOrDims(ref pt) &&
pt.kind == Tokens.CloseParenthesis && IsType(qualident);
}
bool IsType(string qualident)
{
if (typeStrings == null) {
CreateTypeStrings();
}
if (typeStrings.ContainsValue(qualident)) {
return true;
}
foreach (string ns in usingNamespaces) {
if (typeStrings.ContainsValue(String.Concat(ns, '.', qualident))) {
return true;
}
}
return false;
}
bool GuessTypeCast()
{
// check: "(" pointer or array of some type ")" possible type cast successor
if (la.kind != Tokens.OpenParenthesis) return false;
string qualident;
StartPeek();
Token pt = Peek();
if (IsQualident(ref pt, out qualident) && IsPointerOrDims(ref pt) &&
pt.kind == Tokens.CloseParenthesis) {
// check successor
pt = Peek();
return pt.kind == Tokens.Identifier || pt.kind == Tokens.Literal ||
pt.kind == Tokens.OpenParenthesis || ParserUtil.IsUnaryOperator(pt) ||
pt.kind == Tokens.New || pt.kind == Tokens.This ||
pt.kind == Tokens.Base || pt.kind == Tokens.Null ||
pt.kind == Tokens.Checked || pt.kind == Tokens.Unchecked ||
pt.kind == Tokens.Typeof || pt.kind == Tokens.Sizeof ||
(ParserUtil.IsTypeKW(pt) && Peek().kind == Tokens.Dot);
} else return false;
}
void CreateTypeStrings()
{
Assembly a;
Type[] types;
AssemblyName [] aNames;
if (assemblyName != null && assemblyName.Length > 0) { /* AW 2002-12-30 add check for length > 0 */
typeStrings = new Hashtable();
a = Assembly.LoadFrom(assemblyName);
types = a.GetTypes();
foreach (Type t in types)
typeStrings.Add(t.FullName.GetHashCode(), t.FullName);
aNames = a.GetReferencedAssemblies();
for (int i = 0; i < aNames.Length; i++) {
a = Assembly.LoadFrom(aNames[i].Name);
types = a.GetExportedTypes();
foreach(Type t in types)
if (usingNamespaces.Contains(t.FullName.Substring(0, t.FullName.LastIndexOf('.'))))
typeStrings.Add(t.FullName.GetHashCode(), t.FullName);
}
}
}
/* Checks whether the next sequences of tokens is a qualident *
* and returns the qualident string */
/* !!! Proceeds from current peek position !!! */
bool IsQualident(ref Token pt, out string qualident)
{
if (pt.kind == Tokens.Identifier) {
StringBuilder qualidentsb = new StringBuilder(pt.val);
pt = Peek();
while (pt.kind == Tokens.Dot) {
pt = Peek();
if (pt.kind != Tokens.Identifier) {
qualident = String.Empty;
return false;
}
qualidentsb.Append('.');
qualidentsb.Append(pt.val);
pt = Peek();
}
qualident = qualidentsb.ToString();
return true;
}
qualident = String.Empty;
return false;
}
/* skip: { "*" | "[" { "," } "]" } */
/* !!! Proceeds from current peek position !!! */
bool IsPointerOrDims (ref Token pt)
{
for (;;) {
if (pt.kind == Tokens.OpenSquareBracket) {
do pt = Peek();
while (pt.kind == Tokens.Comma);
if (pt.kind != Tokens.CloseSquareBracket) return false;
} else if (pt.kind != Tokens.Times) break;
pt = Peek();
}
return true;
}
/* Return the n-th token after the current lookahead token */
void StartPeek()
{
lexer.StartPeek();
}
Token Peek()
{
return lexer.Peek();
}
Token Peek (int n)
{
lexer.StartPeek();
Token x = la;
while (n > 0) {
x = lexer.Peek();
n--;
}
return x;
}
/*-----------------------------------------------------------------*
* Resolver routines to resolve LL(1) conflicts: * *
* These resolution routine return a boolean value that indicates *
* whether the alternative at hand shall be choosen or not. *
* They are used in IF ( ... ) expressions. *
*-----------------------------------------------------------------*/
/* True, if ident is followed by "=" */
bool IdentAndAsgn ()
{
return la.kind == Tokens.Identifier && Peek(1).kind == Tokens.Assign;
}
bool IsAssignment () { return IdentAndAsgn(); }
/* True, if ident is followed by ",", "=", or ";" */
bool IdentAndCommaOrAsgnOrSColon () {
int peek = Peek(1).kind;
return la.kind == Tokens.Identifier &&
(peek == Tokens.Comma || peek == Tokens.Assign || peek == Tokens.Semicolon);
}
bool IsVarDecl () { return IdentAndCommaOrAsgnOrSColon(); }
/* True, if the comma is not a trailing one, *
* like the last one in: a, b, c, */
bool NotFinalComma () {
int peek = Peek(1).kind;
return la.kind == Tokens.Comma &&
peek != Tokens.CloseCurlyBrace && peek != Tokens.CloseSquareBracket;
}
/* True, if "void" is followed by "*" */
bool NotVoidPointer () {
return la.kind == Tokens.Void && Peek(1).kind != Tokens.Times;
}
/* True, if "checked" or "unchecked" are followed by "{" */
bool UnCheckedAndLBrace () {
return la.kind == Tokens.Checked || la.kind == Tokens.Unchecked &&
Peek(1).kind == Tokens.OpenCurlyBrace;
}
/* True, if "." is followed by an ident */
bool DotAndIdent () {
return la.kind == Tokens.Dot && Peek(1).kind == Tokens.Identifier;
}
/* True, if ident is followed by ":" */
bool IdentAndColon () {
return la.kind == Tokens.Identifier && Peek(1).kind == Tokens.Colon;
}
bool IsLabel () { return IdentAndColon(); }
/* True, if ident is followed by "(" */
bool IdentAndLPar () {
return la.kind == Tokens.Identifier && Peek(1).kind == Tokens.OpenParenthesis;
}
/* True, if "catch" is followed by "(" */
bool CatchAndLPar () {
return la.kind == Tokens.Catch && Peek(1).kind == Tokens.OpenParenthesis;
}
bool IsTypedCatch () { return CatchAndLPar(); }
/* True, if "[" is followed by the ident "assembly" */
bool IsGlobalAttrTarget () {
Token pt = Peek(1);
return la.kind == Tokens.OpenSquareBracket &&
pt.kind == Tokens.Identifier && pt.val == "assembly";
}
/* True, if "[" is followed by "," or "]" */
bool LBrackAndCommaOrRBrack () {
int peek = Peek(1).kind;
return la.kind == Tokens.OpenSquareBracket &&
(peek == Tokens.Comma || peek == Tokens.CloseSquareBracket);
}
bool IsDims () { return LBrackAndCommaOrRBrack(); }
/* True, if "[" is followed by "," or "]" *
* or if the current token is "*" */
bool TimesOrLBrackAndCommaOrRBrack () {
return la.kind == Tokens.Times || LBrackAndCommaOrRBrack();
}
bool IsPointerOrDims () { return TimesOrLBrackAndCommaOrRBrack(); }
bool IsPointer () { return la.kind == Tokens.Times; }
/* True, if lookahead is a primitive type keyword, or *
* if it is a type declaration followed by an ident */
bool IsLocalVarDecl () {
if ((ParserUtil.IsTypeKW(la) && Peek(1).kind != Tokens.Dot) || la.kind == Tokens.Void) return true;
StartPeek();
Token pt = la ; // peek token
string ignore;
return IsQualident(ref pt, out ignore) && IsPointerOrDims(ref pt) &&
pt.kind == Tokens.Identifier;
}
/* True, if lookahead ident is "get" */
bool IdentIsGet () {
return la.kind == Tokens.Identifier && la.val == "get";
}
/* True, if lookahead ident is "set" */
bool IdentIsSet () {
return la.kind == Tokens.Identifier && la.val == "set";
}
/* True, if lookahead ident is "add" */
bool IdentIsAdd () {
return la.kind == Tokens.Identifier && la.val == "add";
}
/* True, if lookahead ident is "remove" */
bool IdentIsRemove () {
return la.kind == Tokens.Identifier && la.val == "remove";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -