合肥生活安徽新聞合肥交通合肥房產(chǎn)生活服務(wù)合肥教育合肥招聘合肥旅游文化藝術(shù)合肥美食合肥地圖合肥社保合肥醫(yī)院企業(yè)服務(wù)合肥法律

        代做CSE340、代寫(xiě)Parsing編程語(yǔ)言
        代做CSE340、代寫(xiě)Parsing編程語(yǔ)言

        時(shí)間:2024-04-19  來(lái)源:合肥網(wǎng)hfw.cc  作者:hfw.cc 我要糾錯(cuò)



        Project 2: Parsing
        The goal of this project is to give you experience in writing a top-down recursive descent parser and to get
        introduced to the basics of symbol tables for nested scopes.
        We begin by introducing the grammar of our language. Then we will discuss the semantics of our
        language that involves lexical scoping rules and name resolution. Finally, we will go over a few examples
        and formalize the expected output.
        NOTE: This project is significantly more involved than the first project. You should start on it immediately.
        1. Lexical Specification
        Here is the list of tokens that your lexical analyzer needs to support:
        Comments and Space
        In addition to these tokens, our input programs might have comments thatshould be ignored by the
        lexical analyzer.Acommentstartswith // andcontinues until a newline characteris encountered. The
        regular expressions for comments is: // (any)* \n in which any is defined to be any character except
        \n . Also, like in the first project, your lexical analyzer should skip space between tokens.
        PUBLIC = “public”
        PRIVATE = “private”
        EQUAL = “=”
        COLON = “:”
        COMMA = “,”
        SEMICOLON = “;”
        LBRACE = “{”
        RBRACE = “}”
        ID = letter (letter + digit)*
        2. Grammar
        Here is the grammar for our input language:
        Here is an example input program with comments:
        Note that our grammar does not recognize comments, so our parser would not know anything about
        comments, but our lexical analyzer would deal with comments. This is similar to handling of spaces by
        the lexer, the lexer skips the spaces. In a similar fashion, your lexer should skip
        program ® global_vars scope
        global_vars ® e
        global_vars ® var_list SEMICOLON
        var_list ® ID
        var_list ® ID COMMA var_list
        scope ® ID LBRACE public_vars private_vars stmt_list RBRACE
        public_vars ® e
        public_vars ® PUBLIC COLON var_list SEMICOLON
        private_vars ® e
        private_vars ® PRIVATE COLON var_list SEMICOLON
        stmt_list ® stmt
        stmt_list ® stmt stmt_list
        stmt ® ID EQUAL ID SEMICOLON
        stmt ® scope
        a, b, c; // These are global variables
        test {
        public:
        a, b, hello; // These are public variables of scope test
        private:
        x, y; // These are private variables of scope test
        a = b; // the body of test starts with this line
        hello = c;
        y = r;
        nested { // this is a nested scope
        public:
        b; // which does not have private variables
        a = b;
        x = hello;
        c = y;
        // we can also have lines that only contain comments like this
        }
        }
        comments.
        We highlight some of the syntactical elements of the language:
        Global variables are optional
        The scopes have optional public and private variables
        Every scope has a body which is a list of statements
        A statement can be either a simple assignment or another scope (a nested scope)
        3. Scoping and Resolving References
        Here are the scoping rules for our language:
        The public variables of a scope are accessible to its nested scopes
        The private variables of a scope are not accessible to its nested scopes
        Lexical scoping rules are used to resolve name references
        Global variables are accessible to all scopes
        Every reference to a variable is resolved to a specific declaration by specifying the variable's
        defining scope. We will use the following notation to specify declarations:
        • If variable a is declared in the global variables list, we use ::a to refer to it
        • If variable a is declared in scope b, we use b.a to refer to it
         And if reference to name a cannot be resolved, we denote that by ?.a
        Here is the example program from the previous section, with all name references resolved (look at the
        comments):

        4. Examples
        The simplest possible program would be:
        Let's add a global variable:
        a, b, c;
        test {
        public:
        a, b, hello;
        private:
        x, y;
        a = b; // test.a = test.b
        hello = c; // test.hello = ::c
        y = r; // test.y = ?.r
        nested {
        public:
        b;
        a = b; // test.a = nested.b
        x = hello; // ?.x = test.hello
        c = y; // ::c = ?.y
        }
        }
        main {
        a = a; // ?.a = ?.a
        }
        a;
        main {
        a = a; // ::a = ::a
        }
        Now, let's add a public variable a:
        Or a private a:
        Now, let's see a simple example with nested scopes:
        If we add a private variable in main:
        a;
        main {
        public:
        a;
        a = a; // main.a = main.a
        }
        a;
        main {
        private:
        a;
        a = a; // main.a = main.a
        }
        a, b;
        main {
        nested {
        a = b; // ::a = ::b
        }
        }
        a, b;
        main {
        private:
        a;
        nested {
        a = b; // ::a = ::b
        }
        }
        And a public b:
        You can find more examples by looking at the test cases and their expected outputs.
        5. Expected Output
        There are two cases:
        In case the input does not follow the grammar, the expected output is:
        NOTE: no extra information is needed here! Also, notice that we need the exact
        message and it's case-sensitive.
        In case the input follows the grammar:
        For every assignment statement in the input program in order of their appearance in the
        program, output the following information:
        • The resolved left-hand-side of the assignment
        • The resolved right-hand-side of the assignment
        in the following format:
        NOTE: You can assume that scopes have unique names and variable names in a single
        scope (public and private) are not repeated.
        a, b;
        main {
        public:
        b;
        private:
        a;
        nested {
        a = b; // ::a = main.b
        }
        }
        Syntax Error
        resolved_lhs = resolved_rhs
        For example, given the following input program:
        The expected output is:
        6. Implementation
        Start by modifying the lexical analyzer from previous project to make it recognize the tokens
        required for parsing this grammar. It should also be able to handle comments (skip them like
        spaces).
        NOTE: make sure you remove the tokens that are not used in this grammar from your
        lexer, otherwise you might not be able to pass all test cases. Your TokenType type declaration
        should look like this:
        a, b, c;
        test {
        public:
        a, b, hello;
        private:
        x, y;
        a = b;
        hello = c;
        y = r;
        nested {
        public:
        b;
        a = b;
        x = hello;
        c = y;
        }
        }
        test.a = test.b
        test.hello = ::c
        test.y = ?.r
        test.a = nested.b
        ?.x = test.hello
        ::c = ?.y
        typedef enum { END_OF_FILE = 0,
        PUBLIC, PRIVATE,
        EQUAL, COLON, COMMA, SEMICOLON,
        LBRACE, RBRACE, ID, ERROR
        } TokenType
        Next, write a parser for the given grammar. You would need one function per each non-terminal
        of the grammar to handle parsing of that non-terminal. I suggest you use the following signature
        for these functions:
        Where X would be replaced by the target non-terminal. The lexical analyzer object needs to be
        accessible to these functions so that they can use the lexer to get and unget tokens. These functions
        can be member functions of a class, and the lexer object can be a member variable of that class.
        You also need a syntax_error function that prints the proper message and terminates
        the program:
        Test your parser thoroughly. Make sure it can detect any syntactical errors.
        Next, write a symbol table that stores information about scopes and variables. You would also
        need to store assignments in a list to be accessed after parsing is finished. You need to think
        about how to organize all this information in a way that is useful for producing the required
        output.
        Write a function that resolves the left-hand- side and right-hand-side of all assignments and
        produces the required output. Call this function in your main() function after successfully
        parsing the input.
        NOTE: you might need more time to finish the last step compared to previous steps.
        7. Requirements
        Here are the requirements of this project:
        You should submit all your project files (source code [.cc] and headers[.h]) on
        Gradescope. Do not zip them.
        You should use C/C++, no other programming languages are allowed.
        • Besides the provided test cases, you need to design test cases on your own to rigorously test your
        implementation.
        You should test your code on Ubuntu Linux 19.04 or greater with gcc 7.5.0 or higher.
        void parse_X()
        void syntax_error()
        {
        cout << “Syntax Error\n”;
        exit(1);
        }
        You cannot use library methods for parsing or regular expression (regex) matching in
        projects. You will be implementing them yourself. If you have doubts about using a library
        method, please check it with the instructor or TA beforehand.
        You can write helper methods or have extra files, but they should have been written by you.
        8. Evaluation
        The submissions are evaluated based on the automated test cases on the Gradescope. Gradescope test cases
        are hidden to students. Your grade will be proportional to the number of test cases passing. You have to
        thoroughly test your program to ensure it pass all the possible test cases. It is not guaranteed that your code
        will pass the Gradescope test cases if it passes the published test cases. As a result, in addition to the
        provided test cases, you must design your own test cases to rigorously evaluate your implementation. If
        your code does not compile on the submission website, you will not receive any points. On Gradescope,
        when you get the results back, ignore the “Test err” case, it is not counted toward the grade.
        The parsing test cases contain cases that are syntactically correct and cases that have syntax errors. If a
        syntax test case has no syntax error, your program passes the test case if the output is not Syntax Error .
        If a syntax test case has syntax error, your program passes the test case if the output is Syntax Error .
        Note that if your program prints the syntax error message independently of the input, for example:
        It will pass some of the test cases, but you will not receive any points.
        You can access the Gradescope through the left side bar in canvas. You have already been enrolled in the
        grade scope class, and using the left side bar in canvas you will automatically get into the Gradescope course.
        int main()
        {
        cout << “Syntax Error\n”;
        return 0;
        }

        請(qǐng)加QQ:99515681  郵箱:99515681@qq.com   WX:codinghelp

















         

        掃一掃在手機(jī)打開(kāi)當(dāng)前頁(yè)
      1. 上一篇:菲律賓入境電子簽證流程有哪些 電子簽辦理指南
      2. 下一篇:代做COMP532、代寫(xiě)a video game from OpenAI Gym
      3. 無(wú)相關(guān)信息
        合肥生活資訊

        合肥圖文信息
        出評(píng) 開(kāi)團(tuán)工具
        出評(píng) 開(kāi)團(tuán)工具
        挖掘機(jī)濾芯提升發(fā)動(dòng)機(jī)性能
        挖掘機(jī)濾芯提升發(fā)動(dòng)機(jī)性能
        戴納斯帝壁掛爐全國(guó)售后服務(wù)電話24小時(shí)官網(wǎng)400(全國(guó)服務(wù)熱線)
        戴納斯帝壁掛爐全國(guó)售后服務(wù)電話24小時(shí)官網(wǎng)
        菲斯曼壁掛爐全國(guó)統(tǒng)一400售后維修服務(wù)電話24小時(shí)服務(wù)熱線
        菲斯曼壁掛爐全國(guó)統(tǒng)一400售后維修服務(wù)電話2
        美的熱水器售后服務(wù)技術(shù)咨詢電話全國(guó)24小時(shí)客服熱線
        美的熱水器售后服務(wù)技術(shù)咨詢電話全國(guó)24小時(shí)
        海信羅馬假日洗衣機(jī)亮相AWE  復(fù)古美學(xué)與現(xiàn)代科技完美結(jié)合
        海信羅馬假日洗衣機(jī)亮相AWE 復(fù)古美學(xué)與現(xiàn)代
        合肥機(jī)場(chǎng)巴士4號(hào)線
        合肥機(jī)場(chǎng)巴士4號(hào)線
        合肥機(jī)場(chǎng)巴士3號(hào)線
        合肥機(jī)場(chǎng)巴士3號(hào)線
      4. 短信驗(yàn)證碼 酒店vi設(shè)計(jì) 投資移民

        關(guān)于我們 | 打賞支持 | 廣告服務(wù) | 聯(lián)系我們 | 網(wǎng)站地圖 | 免責(zé)聲明 | 幫助中心 | 友情鏈接 |

        Copyright © 2025 hfw.cc Inc. All Rights Reserved. 合肥網(wǎng) 版權(quán)所有
        ICP備06013414號(hào)-3 公安備 42010502001045

        亚洲日韩乱码中文无码蜜桃臀网站| 99在线精品视频在线观看| 国产精品青草视频免费播放 | 91精品久久久久久久久中文字幕 | 精品黑人一区二区三区| 久久久久亚洲精品影视| 中文字幕久精品免费视频| 国产精品哟女在线观看| 亚洲国产91精品无码专区| 久久国产日韩精华液的功效| 日韩精品无码免费视频| 国产欧美另类久久久精品图片| 久久久久久久精品成人热色戒| 99精品视频99| 日韩精品久久无码中文字幕| 亚洲国产精品SSS在线观看AV| 亚洲精品美女久久久久99| 99精品久久精品| 91原创国产精品| 国产亚洲精品a在线观看| 中文字幕精品在线视频| 精品国产国产综合精品| 国产成人精品久久综合| 国产成人无码精品久久久久免费| WWW国产精品内射老师| 精品99久久aaa一级毛片| 国产精品高清免费网站| 国产三级精品三级在专区| 精品日韩在线视频一区二区三区 | 日韩美女专区中文字幕| 日韩精品视频免费在线观看| 欧美日韩精品乱国产| 日韩AV高清在线看片| 一区精品麻豆入口| 国产成人AV无码精品| 亚洲AV无码乱码精品国产| 国产成人精品一区二区三区| 精品一区二区三区高清免费观看 | 久9re热视频这里只有精品| 国产精品久久久久乳精品爆| 久久99国产精品久久久|