コード例 #1
0
 private void onInDataType(char c)
 {
     if (ParserUtil.IsNewLineOrWhitespace(c) && result.DataType.Length == 0)
     {
         // Leerzeichen vor dem DataType ignorieren
     }
     else if (ParserUtil.IsValidNameChar(c))
     {
         // Zeichen in DataType schreiben
         result.DataType += c;
     }
     else if (c == '(' && ParserUtil.IsValidDataType(result.DataType))
     {
         Data.Back(1);
         state = IN_PARAMETERS;
     }
     else if (ParserUtil.IsNewLineOrWhitespace(c) && ParserUtil.IsValidDataType(result.DataType))
     {
         // TODO: Mglw. as oder mglw. blanks vor Attributparameter???
         // state => BEHIND_DATATYPE
     }
     else if (c == ';' && ParserUtil.IsValidDataType(result.DataType))
     {
         state = FINAL;
     }
     else
     {
         throw new InvalidCharException("Ungültiges Zeichen im DataType", Data);
     }
 }
コード例 #2
0
        private void onInAttributeType(char c)
        {
            if (ParserUtil.IsNewLineOrWhitespace(c))
            {
                // Trennzeichen zwischen Attributtyp und Attributname/o.ä.
                switch (result.AttributeType)
                {
                case "base":
                case "fact":
                    state = IN_ATTRIBUTE_NAME;
                    break;

                case "ref":
                    state = IN_REF_INTERFACENAME;
                    break;

                default:
                    throw new InvalidTokenException("Ungültiges Token für AttributType => nur base, fact und ref erlaubt", Data);
                }
            }
            else if (ParserUtil.IsValidNameChar(c))
            {
                // Wechsel zu InAttributeType
                this.result.AttributeType += c;
            }
            else
            {
                throw new InvalidCharException($"Ungültiges Zeichen {c} im AttributeType", Data);
            }
        }
コード例 #3
0
 private void onBehindRefFieldName(char c)
 {
     if (ParserUtil.IsNewLineOrWhitespace(c))
     {
         // Ignorieren
     }
     else if (c == 'a' && Data.Content[Data.Position] == 's')
     {
         Data.Next();
         state = IN_ALIAS;
     }
     else if (c == '(')
     {
         Data.Back(1);
         state = IN_REF_PARAMETERS;
     }
     else if (c == ';')
     {
         state = FINAL;
     }
     else
     {
         throw new InvalidCharException("Ungültiges Zeichen nach DataType", Data);
     }
 }
コード例 #4
0
 private void onInRefParameters(char c)
 {
     if (c == '(' || c == ',')
     {
         var param = namedParameterParser.Parse();
         result.Parameters.Add(param);
         Data.Back(1);
     }
     else if (c == ')')
     {
         state = BEHIND_REF_PARAMETERS;
     }
     else if (!ParserUtil.IsNewLineOrWhitespace(c))
     {
         throw new InvalidCharException("Ungültiges Zeichen in Parameterliste", Data);
     }
 }
コード例 #5
0
 private void onInRefInterfaceName(char c)
 {
     if (ParserUtil.IsNewLineOrWhitespace(c) && string.IsNullOrEmpty(result.InterfaceName))
     {
         // Ignorieren
     }
     else if (ParserUtil.IsValidNameChar(c))
     {
         result.InterfaceName += c;
     }
     else if (c == '.' && result.InterfaceName.Length > 0)
     {
         state = IN_REF_FIELDNAME;
     }
     else
     {
         throw new InvalidCharException("Ungültiges Zeichen im RefInterfaceName", Data);
     }
 }
コード例 #6
0
 private void onInAlias(char c)
 {
     if (ParserUtil.IsValidNameChar(c))
     {
         result.Alias += c;
     }
     else if (ParserUtil.IsNewLineOrWhitespace(c) && String.IsNullOrEmpty(result.Alias))
     {
         // Ignorieren
     }
     else if (c == ';')
     {
         state = FINAL;
     }
     else
     {
         throw new InvalidCharException("Ungültiges Zeichen im Alias", Data);
     }
 }
コード例 #7
0
 private void onInitial(char c)
 {
     if (ParserUtil.IsNewLineOrWhitespace(c) && result.AttributeType.Length == 0)
     {
         // Vorangestellte unsichtbare Zeichen erfassen
         whitespaceBuf += c;
     }
     else if (ParserUtil.IsValidNameChar(c))
     {
         // Wechsel zu InAttributeType
         this.result.WhitespaceBefore = whitespaceBuf;
         this.result.AttributeType   += c;
         this.state    = IN_ATTRIBUTE_TYPE;
         whitespaceBuf = "";
     }
     else
     {
         throw new InvalidCharException("Ungültiges Zeichen ...", Data);
     }
 }
コード例 #8
0
 private void onInAttributeName(char c)
 {
     if (ParserUtil.IsNewLineOrWhitespace(c) && result.Name.Length == 0)
     {
         // Leerzeichen vor dem Attributnamen ignorieren
     }
     else if (ParserUtil.IsValidNameChar(c))
     {
         // Zeichen ins Namensfeld schreiben
         result.Name += c;
     }
     else if (c == ':')
     {
         state = IN_DATATYPE;
     }
     else
     {
         throw new InvalidCharException("Ungültiges Zeichen im AttributeName", Data);
     }
 }
コード例 #9
0
 private void onBehindDataType(char c)
 {
     if (ParserUtil.IsNewLineOrWhitespace(c))
     {
         // Ignorieren
     }
     else if (c == 'a' && Data.Content[Data.Position] == 's' && ParserUtil.IsValidDataType(result.DataType))
     {
         Data.Next();
         state = IN_ALIAS;
     }
     else if (c == ';')
     {
         state = FINAL;
     }
     else
     {
         throw new InvalidCharException("Ungültiges Zeichen nach DataType", Data);
     }
 }
コード例 #10
0
 private void onBehindRefParameters(char c)
 {
     if (ParserUtil.IsNewLineOrWhitespace(c))
     {
         // Ignorieren
     }
     else if (c == 'a' && Data.Content[Data.Position] == 's')
     {
         Data.Next();
         state = IN_ALIAS;
     }
     else if (c == ';')
     {
         state = FINAL;
     }
     else
     {
         throw new InvalidCharException($"Ungültiges Zeichen {c} nach Attribut-Parameterliste", Data);
     }
 }
コード例 #11
0
 private void onInRefFieldName(char c)
 {
     if (ParserUtil.IsValidNameChar(c))
     {
         result.FieldName += c;
     }
     else if (c == ' ')
     {
         state = BEHIND_REF_FIELDNAME;
     }
     else if (c == '(')
     {
         Data.Back(1);
         state = IN_REF_PARAMETERS;
     }
     else if (c == ';')
     {
         state = FINAL;
     }
     else
     {
         throw new InvalidCharException("Ungültiges Zeichen im RefFieldName", Data);
     }
 }
コード例 #12
0
        public override TmpInterfaceAttribute Parse(string whitespaceBefore)
        {
            state                = INITIAL;
            whitespaceBuf        = whitespaceBefore; // Den Whitespace-Puffer mit evtl. bereits gelesenen Zeichen füllen
            result               = new TmpInterfaceAttribute();
            result.AttributeType = "";
            result.Parameters    = new List <TmpNamedParameter>();

            result.WhitespaceBefore = whitespaceBefore;

            while (Data.HasNext())
            {
                char c = Data.Next();
                switch (state)
                {
                case INITIAL:
                    onInitial(c);
                    break;

                case IN_ATTRIBUTE_TYPE:
                    onInAttributeType(c);
                    break;

                case IN_ATTRIBUTE_NAME:
                    onInAttributeName(c);
                    break;

                case IN_REF_INTERFACENAME:
                    onInRefInterfaceName(c);
                    break;

                case IN_REF_FIELDNAME:
                    onInRefFieldName(c);
                    break;

                case BEHIND_REF_FIELDNAME:
                    onBehindRefFieldName(c);
                    break;

                case IN_DATATYPE:
                    onInDataType(c);
                    break;

                case BEHIND_DATATYPE:
                    onBehindDataType(c);
                    break;

                case IN_PARAMETERS:
                    onInParameters(c);
                    break;

                case IN_REF_PARAMETERS:
                    onInRefParameters(c);
                    break;

                case BEHIND_REF_PARAMETERS:
                    onBehindRefParameters(c);
                    break;

                case IN_ALIAS:
                    onInAlias(c);
                    break;

                case FINAL:
                    return(result);

                default:
                    throw new InvalidOperationException("Unreachable state reached in AttributeParser!");
                }
            }

            return(result);
        }