zoukankan      html  css  js  c++  java
  • 记念一下阶段性成果

        今天终于可以把 if(a==1&&(c==2||a==3) && (a>3 || b<4) || (w>5 && w<10 && (u>100 || u!=50))) 语句解析成

    Or
        And
            And
                EqualEqual
                    Ident
                    IntLiteral
                Or
                    EqualEqual
                        Ident
                        IntLiteral
                    EqualEqual
                        Ident
                        IntLiteral
            Or
                Greater
                    Ident
                    IntLiteral
                Less
                    Ident
                    IntLiteral
        And
            And
                Greater
                    Ident
                    IntLiteral
                Less
                    Ident
                    IntLiteral
            Or
                Greater
                    Ident
                    IntLiteral
                NotEqual
                    Ident
                    IntLiteral

    了.


    /// <summary>
            
    /// 把比较表达式分析成树结构
            
    /// </summary>
            
    /// <returns></returns>

            private ExpressionNode<ExpressionStatement> ParseExpression()
            
    {
                Stack
    <Stack<ExpressionNode<ExpressionStatement>>> stacks = new Stack<Stack<ExpressionNode<ExpressionStatement>>>();
                Stack
    <ExpressionNode<ExpressionStatement>> nodes = new Stack<ExpressionNode<ExpressionStatement>>();
                
    int m = 1;
                
    int basePrecedence = 0;

                
    while (!_curToken.Equals(_eof))
                
    {
                    
    switch (_curToken.TokenId)
                    
    {
                        
    case TokenId.Ident:
                        
    case TokenId.SIdent:
                        
    case TokenId.IntLiteral:
                        
    case TokenId.RealLiteral:
                        
    case TokenId.TrueLiteral:
                        
    case TokenId.UIntLiteral:
                        
    case TokenId.String:
                        
    case TokenId.FString:
                        
    case TokenId.StringLiteral:
                        
    case TokenId.NullLiteral:
                        
    case TokenId.LongLiteral:
                        
    case TokenId.HexLiteral:
                        
    case TokenId.FalseLiteral:
                        
    case TokenId.DecimalLiteral:
                        
    case TokenId.CharLiteral:
                        
    case TokenId.ULongLiteral:
                            
    {
                                ExpressionStatement exp 
    = new ExpressionStatement(_curToken);
                                ExpressionNode
    <ExpressionStatement> newNode = new ExpressionNode<ExpressionStatement>(exp);
                                
    if (nodes.Count.Equals(0))
                                
    {
                                    nodes.Push(newNode);
                                }

                                
    else if (nodes.Peek().Precedence < (GetPrecedence(NextToken().TokenId) + basePrecedence))
                                
    {
                                    nodes.Push(newNode);
                                }

                                
    else
                                
    {
                                    nodes.Peek().AddRightNode(newNode);

                                    
    if (nodes.Count >= 2)
                                    
    {
                                        ExpressionNode
    <ExpressionStatement> first;

                                        
    while (nodes.Count >= 2)
                                        
    {
                                            first 
    = nodes.Pop();
                                            nodes.Peek().AddRightNode(first);
                                        }

                                    }


                                }

                                Advance();
                                
    break;
                            }

                        
    case TokenId.EqualEqual:
                        
    case TokenId.Greater:
                        
    case TokenId.GreaterEqual:
                        
    case TokenId.Less:
                        
    case TokenId.LessEqual:
                        
    case TokenId.NotEqual:
                            
    {
                                
    // == > >= < <= !=
                                ExpressionStatement exp = new ExpressionStatement(_curToken);
                                ExpressionNode
    <ExpressionStatement> newNode = new ExpressionNode<ExpressionStatement>(exp, GenPrecedence(m));
                                newNode.AddLeftNode(nodes.Pop());
                                nodes.Push(newNode);
                                Advance();
                                
    break;
                            }

                        
    case TokenId.And:
                            
    {
                                
    // &&
                                ExpressionStatement exp = new ExpressionStatement(_curToken);
                                ExpressionNode
    <ExpressionStatement> newNode = new ExpressionNode<ExpressionStatement>(exp, GenPrecedence(m));
                                newNode.AddLeftNode(nodes.Pop());
                                nodes.Push(newNode);
                                Advance();
                                
    break;
                            }

                        
    case TokenId.Or:
                            
    {
                                
    // ||
                                ExpressionStatement exp = new ExpressionStatement(_curToken);
                                ExpressionNode
    <ExpressionStatement> newNode = new ExpressionNode<ExpressionStatement>(exp, GenPrecedence(m));
                                newNode.AddLeftNode(nodes.Pop());
                                nodes.Push(newNode);
                                Advance();
                                
    break;
                            }

                        
    case TokenId.Not:
                            
    {
                                
    // !
                                ExpressionStatement exp = new ExpressionStatement(_curToken);
                                ExpressionNode
    <ExpressionStatement> newNode = new ExpressionNode<ExpressionStatement>(exp, GenPrecedence(m));
                                nodes.Push(newNode);
                                Advance();
                                
    break;
                            }

                        
    case TokenId.Plus:
                        
    case TokenId.PlusEqual:
                        
    case TokenId.Minus:
                        
    case TokenId.MinusEqual:
                            
    {
                                
    // + += - -=
                                ExpressionStatement exp = new ExpressionStatement(_curToken);
                                ExpressionNode
    <ExpressionStatement> newNode = new ExpressionNode<ExpressionStatement>(exp, GenPrecedence(m));
                                newNode.AddLeftNode(nodes.Pop());
                                nodes.Push(newNode);
                                Advance();
                                
    break;
                            }

                        
    case TokenId.Star:
                        
    case TokenId.StarEqual:
                        
    case TokenId.Slash:
                        
    case TokenId.SlashEqual:
                        
    case TokenId.Percent:
                        
    case TokenId.PercentEqual:
                            
    {
                                
    // * *= / /= % %=
                                ExpressionStatement exp = new ExpressionStatement(_curToken);
                                ExpressionNode
    <ExpressionStatement> newNode = new ExpressionNode<ExpressionStatement>(exp, GenPrecedence(m));
                                newNode.AddLeftNode(nodes.Pop());
                                nodes.Push(newNode);

                                Advance();
                                
    break;
                            }

                        
    case TokenId.LParen:
                            
    {
                                m
    ++;
                                basePrecedence 
    += 10;
                                stacks.Push(nodes);
                                nodes 
    = new Stack<ExpressionNode<ExpressionStatement>>();
                                Advance();
                                
    break;
                            }

                        
    case TokenId.RParen:
                            
    {
                                m
    --;
                                basePrecedence 
    -= 10;

                                
    if (m > 0)
                                
    {
                                    
    while (stacks.Count > 0)
                                    
    {
                                        ExpressionNode
    <ExpressionStatement> first = nodes.Pop();
                                        nodes 
    = stacks.Pop();
                                        nodes.Peek().AddRightNode(first);
                                    }

                                    Advance();
                                }

                                
    break;
                            }

                        
    default:
                            
    {
                                Advance();
                                
    break;
                            }

                    }


                    
    if (m.Equals(0))
                    
    {
                        
    break;
                    }

                }


                
    return nodes.Pop();
            }
  • 相关阅读:
    webpack高级概念,Dllplugin打包性能配置(系列十八)
    webpack高级概念,resolve配置(配置文件格式以及文件路径变量)(系列十七)
    webpack高级概念,eslint配置(系列十六)
    webpack高级概念,解决单页面应用路由问题(vue用脚手架,404找不到页面二)(系列十五)
    webpack高级概念,webpack-dev-server解决单页面应用路由问题(手动搭建webpack,不是用脚手架,404找不到页面,一)(系列十五)
    webpack高级概念,使用 WebpackDevServer 实现请求转发二(系列十四)
    webpack高级概念,使用 WebpackDevServer 实现请求转发一 (系列十四)
    webpack高级概念,typeScript的打包配置(系列十三)
    DevEco Device Tool 2.1 Beta1 的Hi3861在Windows平台的编译体验
    最全HarmonyOS文档和社区资源使用技巧
  • 原文地址:https://www.cnblogs.com/afxcn/p/1160151.html
Copyright © 2011-2022 走看看