ln.templates/Scanner.cs

284 lines
10 KiB
C#

using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using ln.templates.streams;
using System.Runtime.InteropServices;
namespace ln.templates
{
/**
*
* Expression Syntax
*
* expr := ( <constant> | ( <objpath> | <path> ) [ "(" <arguments> ")" ] )
* objpath := <keyword> [ "." <objpath> ]
* arguments := <expr> [ "," <arguments> ]
*
*
**/
//public static class Scanner
//{
// private static char[] letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
// private static char[] digits = "0123456789".ToCharArray();
// private static char[] keywordChars = letters.Concat(digits).Concat(new char[] { '_' }).ToArray();
// private static char[] pathChars = keywordChars.Concat(new char[] { '.','/' }).ToArray();
// private static char[] numberChars = digits.Concat(new char[] { '.' }).ToArray();
// private static char[] operatorChars = new char[] { '+', '-', '*', '/' };
// private static char[] ScanValidCharacters(CharStream charStream,char[] validCharacters)
// {
// charStream.Mark();
// while (!charStream.EndOfBuffer && validCharacters.Contains(charStream.Peek())){
// charStream.Read();
// }
// return charStream.GetMarkedIntervall();
// }
// public static String ScanKeyword(CharStream charStream)
// {
// if (!Char.IsLetter(charStream.Peek()))
// throw new ArgumentException(String.Format("ScanKeyword positioned on character {0}", charStream.Peek()));
// return new string(ScanValidCharacters(charStream,keywordChars));
// }
// public static String ScanNumber(CharStream charStream)
// {
// if (!Char.IsDigit(charStream.Peek()))
// throw new ArgumentException(String.Format("ScanNumber positioned on character {0}", charStream.Peek()));
// return new string(ScanValidCharacters(charStream, numberChars));
// }
// public static string ScanString(CharStream charStream)
// {
// if (charStream.Peek() != '"')
// throw new ArgumentException(String.Format("ScanString positioned on {0}", charStream.Peek()));
// charStream.Read();
// charStream.Mark();
// while (charStream.Peek() != '"')
// {
// if (charStream.Read() == '\\')
// {
// charStream.Read();
// }
// }
// string result = new string(charStream.GetMarkedIntervall());
// charStream.Read();
// return result;
// }
// public static PathToken ScanPath(CharStream charStream)
// {
// if (charStream.Peek() != '/')
// throw new ArgumentException(String.Format("ScanPath positioned on character {0}", charStream.Peek()));
// return new PathToken(new string(ScanValidCharacters(charStream, pathChars)));
// }
// public static Token ScanObjectPath(CharStream charStream,ObjectPathToken parent = null){
// if (!Char.IsLetter(charStream.Peek()))
// throw new ArgumentOutOfRangeException(String.Format("ScanObjectPath is not positioned on a letter: {0}",charStream.Peek()));
// String component = ScanKeyword(charStream);
// if (charStream.Peek() == '.')
// {
// charStream.Read();
// return ScanObjectPath(charStream, new ObjectPathToken(component, parent));
// } else if (charStream.Peek() == '(')
// {
// Token[] arguments = ScanArguments(charStream);
// return new CallToken(component, arguments, parent);
// } else {
// return new ObjectPathToken(component, parent);
// }
// }
// public static char[] SeekProcessingInstruction(CharStream charStream)
// {
// charStream.Mark();
// while (!charStream.EndOfBuffer)
// {
// if ((charStream.Remaining > 1) && (charStream.Peek(0) == '<') && (charStream.Peek(1) == '?'))
// break;
// charStream.Read();
// }
// return charStream.GetMarkedIntervall();
// }
// public static Token ScanExpression(CharStream charStream)
// {
// while (!charStream.EndOfBuffer)
// {
// if (charStream.Peek() == '"')
// {
// return new ValueToken(ScanString(charStream));
// }
// else if (Char.IsLetter(charStream.Peek()))
// {
// return ScanObjectPath(charStream);
// }
// else if (charStream.Peek() == '/')
// {
// return ScanPath(charStream);
// }
// else if (Char.IsDigit(charStream.Peek()))
// {
// return new NumberToken(ScanNumber(charStream));
// }
// else
// {
// Console.WriteLine("Unexpected character: {0}", charStream.Read());
// }
// }
// return null;
// }
// public static Token[] ScanArguments(CharStream charStream){
// if (charStream.Peek() != '(')
// throw new ArgumentException(String.Format("ScanArguments not positioned on ("));
// charStream.Read();
// List<Token> arguments = new List<Token>();
// while (!charStream.EndOfBuffer && (charStream.Peek() != ')'))
// {
// if (Char.IsWhiteSpace(charStream.Peek()))
// {
// charStream.Read();
// } else {
// arguments.Add(ScanExpression(charStream));
// while (Char.IsWhiteSpace(charStream.Peek()))
// {
// charStream.Read();
// }
// if (charStream.Peek() == ')')
// {
// break;
// }
// if (charStream.Peek() != ',')
// throw new ArgumentException(String.Format("expected , or ) after argument"));
// }
// }
// charStream.Read();
// return arguments.ToArray();
// }
// public static Token[] ScanParameters(CharStream charStream)
// {
// List<Token> tokens = new List<Token>();
// while (!charStream.EndOfBuffer)
// {
// if ((charStream.Remaining > 1) && (charStream.Peek() == '?') && (charStream.Peek(1) == '>'))
// {
// charStream.Read();
// charStream.Read();
// break;
// }
// else if (Char.IsWhiteSpace(charStream.Peek()))
// {
// charStream.Read();
// } else {
// tokens.Add(ScanExpression(charStream));
// }
// }
// return tokens.ToArray();
// }
// public static void Scan(CharStream sourceStream, FormElement container)
// {
// while (!sourceStream.EndOfBuffer)
// {
// char[] textPart = SeekProcessingInstruction(sourceStream);
// if (textPart.Length > 0)
// {
// new Text(container, textPart);
// }
// if (!sourceStream.EndOfBuffer)
// {
// if (!ScanProcessingInstruction(sourceStream, container))
// {
// return;
// }
// }
// }
// }
// public static bool ScanProcessingInstruction(CharStream sourceStream, FormElement container)
// {
// if ((sourceStream.Remaining > 1) && (sourceStream.Peek(0) == '<') && (sourceStream.Peek(1) == '?'))
// {
// sourceStream.Read();
// sourceStream.Read();
// if (sourceStream.Peek() == '=')
// {
// sourceStream.Read();
// new Var(container, ScanParameters(sourceStream));
// }
// else
// {
// String keyword = ScanKeyword(sourceStream);
// Token[] parameters = ScanParameters(sourceStream);
// switch (keyword)
// {
// case "include":
// new Include(container, parameters);
// break;
// case "head":
// Scan(sourceStream, new Head(container));
// break;
// case "set":
// new Set(container, ((ObjectPathToken)parameters[0]).Component ,parameters[1]);
// break;
// case "iterate":
// Scan(sourceStream, new Iterate(container,((ObjectPathToken)parameters[0]).Component,parameters[1]));
// break;
// case "if":
// Scan(sourceStream, new If(container, parameters[0]));
// break;
// case "editor":
// new Editor(container, parameters);
// break;
// case "frame":
// if (!(parameters[0] is PathToken))
// throw new ArgumentException("<?frame ...?> needs path as argument.");
// container.Form.Frame = (PathToken)parameters[0];
// break;
// case "framed":
// new Framed(container);
// break;
// case "end":
// return false;
// }
// }
// return true;
// }
// else
// {
// throw new ArgumentException("ScanProcessingInstruction was not positioned on PI");
// }
// }
//}
}