private static void DumpLexicalAnalyzer_GetKeywordList(
     RegulationList grammar, string grammarId, CodeTypeDeclaration lexiType)
 {
     {
         // private static readonly List<Keyword> keywords = new List<Keyword>();
         var field = new CodeMemberField(typeof(List <Keyword>), "keywords");
         field.Attributes     = MemberAttributes.Private | MemberAttributes.Static;
         field.InitExpression = new CodeObjectCreateExpression(typeof(List <Keyword>));
         lexiType.Members.Add(field);
     }
     {
         // protected override IEnumerable<Keyword> GetKeywords()
         var method = new CodeMemberMethod();
         method.Name       = "GetKeywords";
         method.Attributes = MemberAttributes.Public | MemberAttributes.Override;
         method.ReturnType = new CodeTypeReference(typeof(IEnumerable <Keyword>));
         var returnKeywords = new CodeMethodReturnStatement(
             new CodeVariableReferenceExpression("keywords"));
         method.Statements.Add(returnKeywords);
         lexiType.Members.Add(method);
     }
     {
         // static DemoLexicalAnalyzer()
         var method = new CodeTypeConstructor();
         method.Name       = GetLexicalAnalyzerName(grammarId);
         method.Attributes = MemberAttributes.Static;
         //{
         //    // List<Keyword> keyword = new List<Keyword>();
         //    var keyword = new CodeVariableDeclarationStatement("List<Keyword>", "keyword");
         //    keyword.InitExpression = new CodeObjectCreateExpression("List<Keyword>");
         //    method.Statements.Add(keyword);
         //}
         var convertor = new TreeNodeType2TokenType();
         foreach (var node in grammar.GetAllTreeNodeLeaveTypes())
         {
             // keywords.Add(new Keyword("__x", "x"));
             if (node.IsIdentifier())
             {
                 TokenType tokenType = convertor.GetTokenType(node);
                 var       ctor      = new CodeObjectCreateExpression(typeof(Keyword),
                                                                      new CodePrimitiveExpression(tokenType.Type),
                                                                      new CodePrimitiveExpression(tokenType.Content));
                 var add = new CodeMethodInvokeExpression(
                     new CodeVariableReferenceExpression("keywords"),
                     "Add",
                     ctor);
                 method.Statements.Add(add);
             }
         }
         //{
         //    // DemoLexicalAnalyzer.keywords = keywords;
         //    var assign = new CodeAssignStatement(
         //        new CodeFieldReferenceExpression(
         //            new CodeSnippetExpression(GetLexicalAnalyzerName(grammarId)), "keywords"),
         //        new CodeVariableReferenceExpression("keywords"));
         //    method.Statements.Add(assign);
         //}
         lexiType.Members.Add(method);
     }
 }
Beispiel #2
0
        private static void DumpTokenTypeConstFields(RegulationList grammar, CodeTypeDeclaration tokenTypeConstType)
        {
            // public const string __colon_colon_equal = "__colon_colon_equal";
            var convertor = new TreeNodeType2TokenType();

            foreach (var node in grammar.GetAllTreeNodeLeaveTypes())
            {
                var field = new CodeMemberField(typeof(string), GetNodeNameInParser(node));
                field.Attributes = MemberAttributes.Public | MemberAttributes.Const;
                TokenType tokenType = convertor.GetTokenType(node);
                field.InitExpression = new CodePrimitiveExpression(tokenType.Type);
                tokenTypeConstType.Members.Add(field);
            }
        }
Beispiel #3
0
        public virtual CodeStatement[] DumpReadToken(string grammarId, SyntaxParserMapAlgorithm algorithm)
        {
            List <CodeStatement> list = new List <CodeStatement>();

            {
                /// if ("XXX" == str)
                var ifStatement = new CodeConditionStatement(
                    new CodeBinaryOperatorExpression(
                        new CodePrimitiveExpression(this.Value.Content),
                        CodeBinaryOperatorType.IdentityEquality,
                        new CodeVariableReferenceExpression("str")));
                {
                    var convertor = new TreeNodeType2TokenType();
                    // result.TokenType = new TokenType("..", "..", "..");
                    var newTokenType = new CodeAssignStatement(
                        new CodePropertyReferenceExpression(
                            new CodeVariableReferenceExpression("result"),
                            "TokenType"),
                        new CodeObjectCreateExpression(typeof(TokenType),
                                                       new CodeFieldReferenceExpression(
                                                           new CodeTypeReferenceExpression(Program.GetTokenConstTypeName(grammarId, algorithm)),
                                                           Program.GetNodeNameInParser(this.Value)),
                                                       new CodePrimitiveExpression(this.Value.Content),
                                                       new CodePrimitiveExpression(this.Value.Nickname)));
                    ifStatement.TrueStatements.Add(newTokenType);
                    // context.NextLetterIndex = context.NextLetterIndex + {0}
                    var pointer = new CodePropertyReferenceExpression(
                        new CodeVariableReferenceExpression("context"), "NextLetterIndex");
                    var incresePointer = new CodeAssignStatement(
                        pointer, new CodeBinaryOperatorExpression(
                            pointer, CodeBinaryOperatorType.Add, new CodePrimitiveExpression(this.Value.Content.Length)));
                    ifStatement.TrueStatements.Add(incresePointer);
                    // return true;
                    var returnTrue = new CodeMethodReturnStatement(new CodePrimitiveExpression(true));
                    ifStatement.TrueStatements.Add(returnTrue);
                }
                list.Add(ifStatement);
            }

            return(list.ToArray());
        }