This commit is contained in:
kudzu_cp 2012-06-13 14:48:33 +00:00
parent 2b7279bce9
commit fd2d485193
7 changed files with 69 additions and 47 deletions

View file

@ -8,5 +8,22 @@
<p> <p>
TODO: Rename Cosmos.IL2CPU to Cosmos.Compiler</p> TODO: Rename Cosmos.IL2CPU to Cosmos.Compiler</p>
<p>
&nbsp;</p>
<h2>
Projects</h2>
<h3>
Cosmos.Compiler.XSharp</h3>
<p>
Compiles X# to C# assembler methods.</p>
<h3>
Cosmos.Compiler.XSharp.Test</h3>
<p>
Test for Cosmos.Compiler.XSharp</p>
<h3>
Cosmos.Compiler.XSharp.XSC</h3>
<p>
Future command line compiler for X#.</p>
</body> </body>
</html> </html>

View file

@ -47,33 +47,19 @@ namespace Cosmos.Compiler.XSharp {
mStart = rPos; mStart = rPos;
return; return;
} }
} else if (xString == "[") {
xToken.Type = TokenType.BracketLeft;
} else if (xString == "]") {
xToken.Type = TokenType.BracketRight;
} else if (xString == "+") {
xToken.Type = TokenType.Plus;
} else if (xString == "-") {
xToken.Type = TokenType.Minus;
} else if (xString == "=") {
xToken.Type = TokenType.Assignment;
} else if (char.IsLetter(xChar1)) { } else if (char.IsLetter(xChar1)) {
if (xString.EndsWith(":")) { string xUpper = xString.ToUpper();
xToken.Type = TokenType.Label; if (mRegisters.Contains(xUpper)) {
xToken.Type = TokenType.Register;
} else if (mOps.Contains(xUpper)) {
xToken.Type = TokenType.OpCode;
} else { } else {
string xUpper = xString.ToUpper(); xToken.Type = TokenType.AlphaNum;
if (mRegisters.Contains(xUpper)) {
xToken.Type = TokenType.Register;
} else if (mOps.Contains(xUpper)) {
xToken.Type = TokenType.OpCode;
} else {
xToken.Type = TokenType.AlphaNum;
}
} }
} else if (char.IsDigit(xChar1)) { } else if (char.IsDigit(xChar1)) {
xToken.Type = TokenType.ValueNumberInt; xToken.Type = TokenType.ValueInt;
} else { } else {
xToken.Type = TokenType.Unknown; xToken.Type = Token.GetTypeForSymbol(xString);
} }
} }
xToken.Value = xString; xToken.Value = xString;
@ -95,8 +81,7 @@ namespace Cosmos.Compiler.XSharp {
xChar = mData[i]; xChar = mData[i];
if (char.IsWhiteSpace(xChar)) { if (char.IsWhiteSpace(xChar)) {
xCharType = CharType.WhiteSpace; xCharType = CharType.WhiteSpace;
} else if (char.IsLetterOrDigit(xChar) || xChar == ':') { } else if (char.IsLetterOrDigit(xChar)) {
// : is for labels
xCharType = CharType.Identifier; xCharType = CharType.Identifier;
} else { } else {
xCharType = CharType.Symbol; xCharType = CharType.Symbol;

View file

@ -6,17 +6,17 @@ using System.Text;
namespace Cosmos.Compiler.XSharp { namespace Cosmos.Compiler.XSharp {
public enum TokenType { public enum TokenType {
// Line based // Line based
Comment, LiteralAsm, Comment, LiteralAsm
// //
Register, Label, OpCode, AlphaNum, , Register, OpCode, AlphaNum
// Values // Values
ValueNumberInt, , ValueInt
// Symbols // Symbols
Assignment, BracketLeft, BracketRight, Plus, Minus, , Assignment, BracketLeft, BracketRight, Plus, Minus, Colon, Dollar
// //
WhiteSpace, , WhiteSpace
// For now used during scanning while user is typing, but in future could be user methods we have to find etc // For now used during scanning while user is typing, but in future could be user methods we have to find etc
Unknown , Unknown
} }
public class Token { public class Token {
@ -24,5 +24,25 @@ namespace Cosmos.Compiler.XSharp {
public int SrcPosStart; public int SrcPosStart;
public int SrcPosEnd; public int SrcPosEnd;
public string Value; public string Value;
public static TokenType GetTypeForSymbol(string aSymbol) {
if (aSymbol == "[") {
return TokenType.BracketLeft;
} else if (aSymbol == "]") {
return TokenType.BracketRight;
} else if (aSymbol == "+") {
return TokenType.Plus;
} else if (aSymbol == "-") {
return TokenType.Minus;
} else if (aSymbol == "=") {
return TokenType.Assignment;
} else if (aSymbol == ":") {
return TokenType.Colon;
} else if (aSymbol == "$") {
return TokenType.Dollar;
} else {
return TokenType.Unknown;
}
}
} }
} }

View file

@ -26,19 +26,12 @@ namespace Cosmos.Compiler.XSharp {
} else if (string.Compare(xPart, "ABC") == 0) { } else if (string.Compare(xPart, "ABC") == 0) {
xTokenType = TokenType.AlphaNum; xTokenType = TokenType.AlphaNum;
} else if (char.IsDigit(xPart[0])) { } else if (char.IsDigit(xPart[0])) {
xTokenType = TokenType.ValueNumberInt; xTokenType = TokenType.ValueInt;
} else if (xPart == "=") {
xTokenType = TokenType.Assignment;
} else if (xPart == "[") {
xTokenType = TokenType.BracketLeft;
} else if (xPart == "]") {
xTokenType = TokenType.BracketRight;
} else if (xPart == "+") {
xTokenType = TokenType.Plus;
} else if (xPart == "-") {
xTokenType = TokenType.Minus;
} else { } else {
throw new Exception("Unrecognized string token: " + xPart); xTokenType = Token.GetTypeForSymbol(xPart);
if (xTokenType == TokenType.Unknown) {
throw new Exception("Unrecognized string token: " + xPart);
}
} }
xTokenTypes.Add(xTokenType); xTokenTypes.Add(xTokenType);
} }

View file

@ -15,6 +15,9 @@ namespace Cosmos.Compiler.XSharp {
Add(new TokenType[] { TokenType.Comment }, Add(new TokenType[] { TokenType.Comment },
"new Comment(\"{0}\");" "new Comment(\"{0}\");"
); );
Add("ABC:" ,
"new Label(\"{0}\");"
);
Add("REG = 123", Add("REG = 123",
"new Mov{{ DestinationReg = RegistersEnum.{0}, SourceValue = {2} }};" "new Mov{{ DestinationReg = RegistersEnum.{0}, SourceValue = {2} }};"

View file

@ -30,7 +30,10 @@
To Do</h3> To Do</h3>
<ul> <ul>
<li>X#<ul> <li>X#<ul>
<li>Hex Values - $FF</li> <li>Hex Values - $FF<ul>
<li>Can scan for $ + AlphaNum or ValueNum and convert to ValueNumHex with value 0x00</li>
</ul>
</li>
<li>Complete</li> <li>Complete</li>
<li>Code Completion</li> <li>Code Completion</li>
</ul> </ul>

View file

@ -28,20 +28,21 @@ namespace Cosmos.VS.XSharp {
mTokenMap[i].Color = TokenColor.Text; mTokenMap[i].Color = TokenColor.Text;
} }
mTokenMap[(int)XSC.TokenType.Label] = new TokenData { Type = TokenType.Identifier, Color = TokenColor.Identifier };
mTokenMap[(int)XSC.TokenType.Comment] = new TokenData { Type = TokenType.LineComment, Color = TokenColor.Comment }; mTokenMap[(int)XSC.TokenType.Comment] = new TokenData { Type = TokenType.LineComment, Color = TokenColor.Comment };
mTokenMap[(int)XSC.TokenType.LiteralAsm] = new TokenData { Type = TokenType.Literal , Color = TokenColor.String }; mTokenMap[(int)XSC.TokenType.LiteralAsm] = new TokenData { Type = TokenType.Literal , Color = TokenColor.String };
mTokenMap[(int)XSC.TokenType.Register] = new TokenData { Type = TokenType.Keyword , Color = TokenColor.Keyword }; mTokenMap[(int)XSC.TokenType.Register] = new TokenData { Type = TokenType.Keyword , Color = TokenColor.Keyword };
mTokenMap[(int)XSC.TokenType.OpCode] = new TokenData { Type = TokenType.Keyword , Color = TokenColor.Keyword }; mTokenMap[(int)XSC.TokenType.OpCode] = new TokenData { Type = TokenType.Keyword , Color = TokenColor.Keyword };
mTokenMap[(int)XSC.TokenType.AlphaNum] = new TokenData { Type = TokenType.Identifier, Color = TokenColor.Identifier }; mTokenMap[(int)XSC.TokenType.AlphaNum] = new TokenData { Type = TokenType.Identifier, Color = TokenColor.Identifier };
mTokenMap[(int)XSC.TokenType.Assignment] = new TokenData { Type = TokenType.Operator, Color = TokenColor.Text }; mTokenMap[(int)XSC.TokenType.Assignment] = new TokenData { Type = TokenType.Operator, Color = TokenColor.Text };
mTokenMap[(int)XSC.TokenType.ValueNumberInt] = new TokenData { Type = TokenType.Literal , Color = TokenColor.Number }; mTokenMap[(int)XSC.TokenType.ValueInt] = new TokenData { Type = TokenType.Literal, Color = TokenColor.Number };
mTokenMap[(int)XSC.TokenType.BracketLeft] = new TokenData { Type = TokenType.Delimiter , Color = TokenColor.Text }; mTokenMap[(int)XSC.TokenType.BracketLeft] = new TokenData { Type = TokenType.Delimiter , Color = TokenColor.Text };
mTokenMap[(int)XSC.TokenType.BracketRight] = new TokenData { Type = TokenType.Delimiter , Color = TokenColor.Text }; mTokenMap[(int)XSC.TokenType.BracketRight] = new TokenData { Type = TokenType.Delimiter , Color = TokenColor.Text };
mTokenMap[(int)XSC.TokenType.Plus] = new TokenData { Type = TokenType.Operator , Color = TokenColor.Text }; mTokenMap[(int)XSC.TokenType.Plus] = new TokenData { Type = TokenType.Operator , Color = TokenColor.Text };
mTokenMap[(int)XSC.TokenType.Minus] = new TokenData { Type = TokenType.Operator , Color = TokenColor.Text }; mTokenMap[(int)XSC.TokenType.Minus] = new TokenData { Type = TokenType.Operator, Color = TokenColor.Text };
mTokenMap[(int)XSC.TokenType.Colon] = new TokenData { Type = TokenType.Operator, Color = TokenColor.Text };
mTokenMap[(int)XSC.TokenType.Dollar] = new TokenData { Type = TokenType.Operator, Color = TokenColor.Text };
mTokenMap[(int)XSC.TokenType.WhiteSpace] = new TokenData { Type = TokenType.WhiteSpace, Color = TokenColor.Text }; mTokenMap[(int)XSC.TokenType.WhiteSpace] = new TokenData { Type = TokenType.WhiteSpace, Color = TokenColor.Text };
mTokenMap[(int)XSC.TokenType.Unknown] = new TokenData { Type = TokenType.Unknown, Color = TokenColor.Text }; mTokenMap[(int)XSC.TokenType.Unknown] = new TokenData { Type = TokenType.Unknown, Color = TokenColor.Text };