284 lines
10 KiB
C#
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");
|
|
// }
|
|
// }
|
|
|
|
//}
|
|
}
|