public static AST.INode Parse(CharStream stream) { var startingPos = stream.Position; try { AST.INode root; if(!Property.PeekAndParse(stream, out root)) { root = IdentifierExpression.Parse(stream); } stream.SkipString("::"); // we either have an expression or a simple identifier AST.INode identifier; if (stream.SkipIfPossible('[')) { identifier = Expression.Parse(stream); stream.SkipCharacter(']'); } else { identifier = new AST.Identifier(Identifier.Parse(stream, false)); } // We can also have optionally a property expression, // starting with a simple identifier or straight away with an expression AST.PropertyExpression propertyExpression = null; if (stream.SkipIfPossible('.')) { propertyExpression = Property.Parse(stream) as AST.PropertyExpression; } else if (stream.SkipIfPossible('[')) { var expression = Expression.Parse(stream); propertyExpression = new AST.PropertyExpression(expression); stream.SkipCharacter(']'); Property.Parse(stream, propertyExpression); } return new AST.AttributeExpression(root, identifier, propertyExpression); } catch (Exception e) { string msg = String.Format( "something went wrong parsing an <property_expression> starting at {0}", stream.ComputeDetailedPosition(startingPos)); throw new Exceptions.ParseException(msg, e); } }
public static AST.INode Parse(CharStream stream, AST.PropertyExpression property = null) { var startingPos = stream.Position; try { if (property == null) { var obj = IdentifierExpression.Parse(stream); property = new AST.PropertyExpression(obj); } char c; // can be either a simple identifier ('.') or expression ('[') while (stream.SkipAnyIfPossible(new char[] {'.', '['}, out c)) { if (c == '.') { property.Add(Identifier.Parse(stream, false)); } else { WhiteSpace.Parse(stream, true); property.Add(Expression.Parse(stream)); WhiteSpace.Parse(stream, true); stream.SkipCharacter(']'); } } return property; } catch (Exception e) { string msg = String.Format( "something went wrong parsing an <property_expression> starting at {0}", stream.ComputeDetailedPosition(startingPos)); throw new Exceptions.ParseException(msg, e); } }