精华内容
下载资源
问答
  • 用C++编写的类C语言编译器,代码清晰。完成词法分析、语法分析LR1、语义分析。其中LR语法分析自动生成action-goto表。语义分析生成三地址码。可做编译原理课程设计大作业等等。
  • 中国矿业大学编译原理实践课程,C语言编译器词法分析
  • 编译器词法分析I/O词法分析分类组成I/O通信——编制方式I/O独立编址内存映射编址混合编址I/O控制方式程序直接控制中断驱动方式DMA直接存储方式I/O通道I/O软件设备独立性软件设备驱动程序中断处理程序硬件 I/O词法...

    基本概念

    理论知识

    1. 编译器会将我们输入的代码看作是字符串序列,所以,词法分析器的主要工作就是从字符串中识别出正确的单词进行区分,比如,我们输入的 “int a”,编译器应该做到识别出int 和a,并且能够在后续的处理中,清楚的知道a是一个变量名,不是函数名,并且后续可以进行赋值等操作。

    2. 虽然很多单词可以通过空格区分开,但是在写代码的时候,我们通常是不会主动的打空格的,大多数都是编译器主动为我们添加上空格,或者是编译器不进行任何处理,所以,词法分析器的主要目的即使将字符串中的单词找出来。

    3. 所以,词法分析器的主要难点就在于怎么识别出单词,要知道,代码中的单词是无穷无尽的,所以,我们要设计一些规则来告诉编译器什么样的是单词,并且,我们要清楚,编译器在拿到这些规则之后怎么正确的识别单词。

    单词&模式&词素

    1. 单词:字符串集合,每个字符串的类别,比如,标识符(变量)、数字、关键字,这些都是单词,他们都是一个类别,int a中的a就是一个变量,它属于的类别就是标识符

    2. 模式:模式就是这个类别所有单词的共同属性

    3. 词素:就是单词中确切的符号串,单词是符号串集合,词素就是集合中具体的符号串,模式,就是这个集合的特点

    在这里插入图片描述

    正则表达式

    定义

    1. 我们前面提到了单词和模式,所以,我们的主要工作就是定义单词的模式,这个定义方法就是正则表达式
    2. 正则表达式:
      在这里插入图片描述在这里插入图片描述
      在这里插入图片描述

    正则表达式运算

    | :或(并)、连接、闭包,他们对应的都是字符串的运算,所以,知道了字符串的特性,运算的性质也很显然。

    正则表达式无法描述的语言

    在这里插入图片描述

    NFA

    状态转换图

    正则表达式定义了单词的描述规则,那么在知道了单词的规则之后应该怎么识别单词?

    我们知道输入的代码时字符串,所以,我们的第一想法就是根据定义从头到尾遍历,判断目前的字符符合哪个规则,而字符的长度在按照最长匹配的原则,比如,有一个识别的时aaa,另一个识别的是aaab,那么,如果输入的是aaaa就会将前三个aaa识别为单词一,如果输入的是aaab,就会将字符串识别为单词二,这种想法很简单。

    他的更明显的展现形式就是NFA,不确定状态转换图。

    在这里插入图片描述
    在这里插入图片描述注意状态6,他表示的是刚刚识别了>,并不表示对应的是>和≥

    整个算法的流程就是从初态(0号状态)开始,如果下一个字符是>,就去一号状态,到达一号状态后,如果下一个字符是=,则到达7号状态,如果是其余字符,则进入8号状态,我们把7号状态叫做终态,终态对应的就是明确的单词,这里面就是≥,需要注意的是,终态对应的也是单词,就是符号串集合,并不是字符串,比如识别标识符和终态就应该对应很多符号串

    具体定义

    在这里插入图片描述
    在这里插入图片描述

    DFA

    定义

    NFA和DFA的区别就是一个是确定的,一个是不确定的,确不确定就体现在状态转换图的边上,NFA的状态转换图多条边上可以写同样的字符,也就是意味着,接收下一个字符可以去多个状态,这就意味着如果某个状态突然无法识别了,就需要进行回溯,DFA就是确定的,明确每一条边上的字符否是不同的。

    除此之外,很重要的就是,NFA的边上可以是空字符串,就代表两个状态时相同的,但是为什么会有空字符串后面就知道了,DFA的边上就不会是空字符串。

    在这里插入图片描述

    中断驱动方式

    I/O控制器从CPU接受一个指令,然后从外围设备读,一旦数据读入到控制器的数据寄存器,便通过控制线给CPU发出中断信号,表示已经准备好
    优点:CPU和I/O可并行,利用率提高
    缺点:每个字都会触发一次中断

    正则表达式→NFA

    Thompson构造法

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    NFA→DFA

    字集构造法

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 1. 定义词法单元Tag首先要将可能出现的词进行分类,可以有不同的分类方式。如多符一类:将所有逗号、分号、括号等都归为一类,或者一符一类,将一个符号归为一类。我这里采用的是一符一类的方式。C代码如下:#ifndef...

    1. 定义词法单元Tag

    首先要将可能出现的词进行分类,可以有不同的分类方式。如多符一类:将所有逗号、分号、括号等都归为一类,或者一符一类,将一个符号归为一类。我这里采用的是一符一类的方式。C代码如下:

    #ifndef TAG_H

    #define TAG_H

    namespace Tag {

    //保留字

    const int

    INT = 1, BOOL = 2, MAIN = 3, IF = 4,

    ELSE = 5, FOR = 6, WHILE = 7, FALSE = 8,

    BREAK = 9, RETURN = 10, TRUE = 11 ;

    //运算符

    const int

    NOT = 20, NE = 21, AUTOMINUS =22, MINUS = 23,

    AUTOADD = 24, ADD = 25, OR = 26,

    AND = 27, MUTIPLY = 28, DIVIDE = 29, MOD = 30,

    EQ = 31, ASSIN = 32, GE = 33, GT = 34,

    LE = 35, LS = 36;

    //分界符

    const int

    COMMA = 40, SEMICOLON = 41, LLBRACKET = 42,

    RLBRACKET = 43, LMBRACKET = 44, RMBRACKET = 45,

    LGBRACKET = 46, RGBRACKET = 47;

    //整数常数

    const int NUM = 50;

    //标识符

    const int ID = 60;

    //错误

    const int ERROR = 404;

    //空

    const int EMPTY = 70;

    }

    #endif

    2. 具体步骤

    一个一个字符地扫描测试代码,忽略空白字符,遇到回车时,记录行数加1

    要进行区分标识符(即普通变量名字)和保留字

    因为将标识符和常数都guiwe各自归为一类,所以要有算法能够识别出一整个常数和完整的标识符

    加入适当的非法词检测

    3. 设计词法分析类

    设计一个词法分析器,当然要包括如何存储一个词法单元,如何扫描(scan)测试代码等,直接上代码:

    myLexer.h

    #ifndef MYLEXER_H

    #define MYLEXER_H

    #include

    #include

    #include

    #include "tag.h"

    /*

    * 主要是定义基本的词法单元类,

    * 声明了词法分析类

    */

    //存储词法单元

    class Word {

    public:

    Word() = default;

    Word(std::string s, int t) : lexeme(s), tag(t) {};

    std::string getLexeme() { return lexeme; };

    int getTag() { return tag; }

    void setTag(int t) { tag = t; }

    void setLexeme(std::string s) { lexeme = s; }

    private:

    std::string lexeme;

    int tag;

    };

    //词法分析器类

    class Lexer {

    public:

    Lexer();

    void reserve(Word w);

    bool readnext(char c, std::ifstream &in);

    Word scan(std::ifstream &in);

    int getLine() { return line; }

    private:

    char peek;

    std::unordered_map<:string word> words;

    int line;

    };

    #endif

    myLexer.cpp

    #include

    #include

    #include

    #include "myLexer.h"

    void Lexer::reserve(Word w) {

    words.insert({w.getLexeme(), w});

    }

    Lexer::Lexer() {

    //存入保留字,为了区分标识符

    reserve( Word("int", Tag::INT) );

    reserve( Word("bool", Tag::BOOL) );

    reserve( Word("main", Tag::MAIN) );

    reserve( Word("if", Tag::IF) );

    reserve( Word("else", Tag::ELSE) );

    reserve( Word("for", Tag::FOR) );

    reserve( Word("while", Tag::WHILE) );

    reserve( Word("break", Tag::BREAK) );

    reserve( Word("return", Tag::RETURN) );

    reserve( Word("true", Tag::TRUE) );

    reserve( Word("false", Tag::FALSE) );

    peek = ' ';

    line = 1;

    }

    //方便处理像>=,++等这些两个字符连在一起的运算符

    bool Lexer::readnext(char c, std::ifstream &in) {

    in >> peek;

    if( peek != c)

    return false;

    peek = ' ';

    return true;

    }

    Word Lexer::scan(std::ifstream &in) {

    //跳过空白符

    while(!in.eof()) {

    if(peek == ' ' || peek == '') {

    in >> peek;

    continue;

    }

    else if(peek == '

    ')

    ++line;

    else

    break;

    in >> peek;

    }

    //处理分界符、运算符等

    switch(peek) {

    case '!':

    if(readnext('=', in))

    return Word("!=", Tag::NE);

    else

    return Word("!", Tag::NOT);

    case '-':

    if(readnext('-', in))

    return Word("--", Tag::AUTOMINUS);

    else

    return Word("-", Tag::MINUS);

    case '+':

    if(readnext('+', in))

    return Word("++", Tag::AUTOADD);

    else

    return Word("+", Tag::ADD);

    case '|':

    if(readnext('|', in))

    return Word("||", Tag::OR);

    else

    return Word("error", Tag::ERROR);

    case '&':

    if(readnext('&', in))

    return Word("&&", Tag::AND);

    else

    return Word("error", Tag::ERROR);

    case '*':

    in >> peek;

    return Word("*", Tag::MUTIPLY);

    case '/':

    in >> peek;

    return Word("/", Tag::DIVIDE);

    case '%':

    in >> peek;

    return Word("%", Tag::MOD);

    case '=':

    if(readnext('=', in))

    return Word("==", Tag::EQ);

    else

    return Word("=", Tag::ASSIN);

    case '>':

    if(readnext('=', in))

    return Word(">=", Tag::GE);

    else

    return Word(">", Tag::GT);

    case '

    if(readnext('=', in))

    return Word("<=", Tag::LE);

    else

    return Word("

    case ',':

    in >> peek;

    return Word(",", Tag::COMMA);

    case ';':

    in >> peek;

    return Word(";", Tag::SEMICOLON);

    case '(':

    in >> peek;

    return Word("(", Tag::LLBRACKET);

    case ')':

    in >> peek;

    return Word(")", Tag::RLBRACKET);

    case '[':

    in >> peek;

    return Word("[", Tag::LMBRACKET);

    case ']':

    in >> peek;

    return Word("]", Tag::RMBRACKET);

    case '{':

    in >> peek;

    return Word("{", Tag::LGBRACKET);

    case '}':

    in >> peek;

    return Word("}", Tag::RGBRACKET);

    }

    //处理常数

    if(isdigit(peek)) {

    int v = 0;

    do {

    v = 10*v + peek - 48;

    in >> peek;

    } while(isdigit(peek));

    if(peek != '.')

    return Word(std::to_string(v), Tag::NUM);

    }

    //处理标识符

    if(isalpha(peek)) {

    std::ostringstream b;

    do {

    b << peek;

    in >> peek;

    } while(isalnum(peek) || peek == '_');

    std::string tmp = b.str();

    //判断是否为保留字

    if(words.find(tmp) != words.end())

    return words[tmp];

    else

    return Word(tmp, Tag::ID);

    }

    if(peek != ' ' && peek != '' && peek != '

    ')

    return Word("error", Tag::ERROR);

    return Word("empty", Tag::EMPTY);

    }

    设计完成后,自己写一个Main函数,在while循环中调用scan函数,每次打印出Word内容,就能够得到

    展开全文
  • C语言的标识符经过词法分析器后转化成机内符,对于标识符来说,其机内符由类别码和内部码组成,但仅有类别码是无法区分记录不同标识符的,所以想问一下c语言标识符的内部码实现了什么?是怎么实现的?用了什么数据结构...
  • c语言编译器源代码.................\small c for dos源代码.................\.....................\ABS.C.................\.....................\ATOI.C.................\.....................\ATOIB.C.........

    c语言编译器源代码

    .................\small c for dos源代码

    .................\.....................\ABS.C

    .................\.....................\ATOI.C

    .................\.....................\ATOIB.C

    .................\.....................\AVAIL.C

    .................\.....................\CALLOC.C

    .................\.....................\CC.DEF

    .................\.....................\CC1.C

    .................\.....................\CC1.EXE

    .................\.....................\CC11.C

    .................\.....................\CC12.C

    .................\.....................\CC13.C

    .................\.....................\CC2.C

    .................\.....................\CC21.C

    .................\.....................\CC22.C

    .................\.....................\CC3.C

    .................\.....................\CC31.C

    .................\.....................\CC32.C

    .................\.....................\CC33.C

    .................\.....................\CC4.C

    .................\.....................\CC41.C

    .................\.....................\CC42.C

    .................\.....................\CC86.EXE

    .................\.....................\CLEARERR.C

    .................\.....................\CLIB.DEF

    .................\.....................\CLIB.LIB

    .................\.....................\COMPILE.BAT

    .................\.....................\CSEEK.C

    .................\.....................\CSYSLIB.C

    .................\.....................\CTELL.C

    .................\.....................\DTOI.C

    .................\.....................\EPILOG.H

    .................\.....................\EXIT.C

    .................\.....................\FCLOSE.C

    .................\.....................\FEOF.C

    .................\.....................\FERROR.C

    .................\.....................\FGETC.C

    .................\.....................\FGETS.C

    .................\.....................\FOPEN.C

    .................\.....................\FPRINTF.C

    .................\.....................\FPUTC.C

    .................\.....................\FPUTS.C

    .................\.....................\FREAD.C

    .................\.....................\FREE.C

    .................\.....................\FREOPEN.C

    .................\.....................\FSCANF.C

    .................\.....................\FWRITE.C

    .................\.....................\GETARG.C

    .................\.....................\GETCHAR.C

    .................\.....................\ISALNUM.C

    .................\.....................\ISALPHA.C

    .................\.....................\ISASCII.C

    .................\.....................\ISATTY.C

    .................\.....................\ISCNTRL.C

    .................\.....................\ISCONS.C

    .................\.....................\ISDIGIT.C

    .................\.....................\ISGRAPH.C

    .................\.....................\ISLOWER.C

    .................\.....................\ISPRINT.C

    .................\.....................\ISPUNCT.C

    .................\.....................\ISSPACE.C

    .................\.....................\ISUPPER.C

    .................\.....................\ISXDIGIT.C

    .................\.....................\ITOA.C

    .................\.....................\ITOAB.C

    .................\.....................\ITOD.C

    .................\.....................\ITOO.C

    .................\.....................\ITOU.C

    .................\.....................\ITOX.C

    .................\.....................\LEFT.C

    .................\.....................\LEXCMP.C

    .................\.....................\LIBMAKE.TXT

    .................\.....................\MALLOC.C

    .................\.....................\NOTICE.H

    .................\.....................\OTOI.C

    .................\.....................\PAD.C

    .................\.....................\POLL.C

    .................\.....................\PROLOG.H

    .................\.....................\PUTCHAR.C

    .................\.....................\PUTS.C

    .................\.....................\README.DOC

    .................\.....................\RENAME.C

    .................\.....................\REVERSE.C

    .................\.....................\REWIND.C

    .................\....

    展开全文
  • 词法分析为c++,语法分析为java
  • 编译器c语言 词法分析编译器c语言 词法分析编译器c语言 词法分析编译器c语言 词法分析编译器c语言 词法分析编译器c语言 词法分析
  • C语言编译器_编译原理_词法分析_语法分析_java图形界面版本_CompilingPrinciple.zip
  • 运用c语言写的词法分析器,完成对程序中的构词的分析功能。代码长度三百多行,上传的东东已在VC编译器中通过,和大家共同学习,参考。
  • c语言编译器c语言编译器 因此,您已经解析了代码并为其构建了一个清晰的AST。 现在该检查用户表达的内容是否完全有意义。 我们应该执行验证,识别语义错误,以与词汇和句法错误(由解析器提供)进行通信。 建立...

    c语言编译器c语言编译器

    因此,您已经解析了代码并为其构建了一个清晰的AST。 现在该检查用户表达的内容是否完全有意义。 我们应该执行验证,识别语义错误,以与词汇和句法错误(由解析器提供)进行通信。

    建立自己的语言的系列

    以前的帖子:

    1. 建立一个词法分析器
    2. 建立一个解析器
    3. 创建带有语法突出显示的编辑器
    4. 使用自动补全功能构建编辑器
    5. 将解析树映射到抽象语法树
    6. 建模转换

    代码在GitHub上的标签为07_validation

    实施语义检查

    在上一篇文章中,我们看到了如何实现函数过程以在AST的所有节点上执行操作。 典型的情况是我们只想在某些节点上执行某些操作。 我们仍然希望使用过程来导航树。 我们可以通过创建名为specificProcess的函数来做到这一点。

    fun <T: Node> Node.specificProcess(klass: Class<T>, operation: (T) -> Unit) {
        process { if (klass.isInstance(it)) { operation(it as T) } }
    }

    让我们看看如何使用specificProcess来:

    • 查找所有VariableDeclarations并检查它们是否未重新声明已经声明的变量
    • 找到所有VarReferences并确认它们没有引用尚未声明或在VarReference之后声明的变量
    • 执行上VarReferences做也分配相同的检查
    data class Error(val message: String, val position: Point)
    
    fun SandyFile.validate() : List<Error> {
        val errors = LinkedList<Error>()
    
        // check a variable is not duplicated
        val varsByName = HashMap<String, VarDeclaration>()
        this.specificProcess(VarDeclaration::class.java) {
            if (varsByName.containsKey(it.varName)) {
                errors.add(Error("A variable named '${it.varName}' has been already declared at ${varsByName[it.varName]!!.position!!.start}",
                        it.position!!.start))
            } else {
                varsByName[it.varName] = it
            }
        }
    
        // check a variable is not referred before being declared
        this.specificProcess(VarReference::class.java) {
            if (!varsByName.containsKey(it.varName)) {
                errors.add(Error("There is no variable named '${it.varName}'", it.position!!.start))
            } else if (it.isBefore(varsByName[it.varName]!!)) {
                errors.add(Error("You cannot refer to variable '${it.varName}' before its declaration", it.position!!.start))
            }
        }
        this.specificProcess(Assignment::class.java) {
            if (!varsByName.containsKey(it.varName)) {
                errors.add(Error("There is no variable named '${it.varName}'", it.position!!.start))
            } else if (it.isBefore(varsByName[it.varName]!!)) {
                errors.add(Error("You cannot refer to variable '${it.varName}' before its declaration", it.position!!.start))
            }
        }
    
        return errors
    }

    好的,因此在AST根目录上调用validate将返回所有可能的语义错误。

    获取所有错误:词汇,句法和语义

    我们首先需要调用ANTLR解析器并获取:

    • 解析树
    • 词汇和句法错误列表
    data class AntlrParsingResult(val root : SandyFileContext?, val errors: List<Error>) {
        fun isCorrect() = errors.isEmpty() && root != null
    }
    
    fun String.toStream(charset: Charset = Charsets.UTF_8) = ByteArrayInputStream(toByteArray(charset))
    
    object SandyAntlrParserFacade {
    
        fun parse(code: String) : AntlrParsingResult = parse(code.toStream())
    
        fun parse(file: File) : AntlrParsingResult = parse(FileInputStream(file))
    
        fun parse(inputStream: InputStream) : AntlrParsingResult {
            val lexicalAndSyntaticErrors = LinkedList<Error>()
            val errorListener = object : ANTLRErrorListener {
                override fun reportAmbiguity(p0: Parser?, p1: DFA?, p2: Int, p3: Int, p4: Boolean, p5: BitSet?, p6: ATNConfigSet?) {
                    // Ignored for now
                }
    
                override fun reportAttemptingFullContext(p0: Parser?, p1: DFA?, p2: Int, p3: Int, p4: BitSet?, p5: ATNConfigSet?) {
                    // Ignored for now
                }
    
                override fun syntaxError(recognizer: Recognizer<*, *>?, offendingSymbol: Any?, line: Int, charPositionInline: Int, msg: String, ex: RecognitionException?) {
                    lexicalAndSyntaticErrors.add(Error(msg, Point(line, charPositionInline)))
                }
    
                override fun reportContextSensitivity(p0: Parser?, p1: DFA?, p2: Int, p3: Int, p4: Int, p5: ATNConfigSet?) {
                    // Ignored for now
                }
            }
    
            val lexer = SandyLexer(ANTLRInputStream(inputStream))
            lexer.removeErrorListeners()
            lexer.addErrorListener(errorListener)
            val parser = SandyParser(CommonTokenStream(lexer))
            parser.removeErrorListeners()
            parser.addErrorListener(errorListener)
            val antlrRoot = parser.sandyFile()
            return AntlrParsingResult(antlrRoot, lexicalAndSyntaticErrors)
        }
    
    }

    然后我们将解析树映射到AST并执行语义验证。 最后,我们返回AST和所有错误。

    data class ParsingResult(val root : SandyFile?, val errors: List<Error>) {
        fun isCorrect() = errors.isEmpty() && root != null
    }
    
    object SandyParserFacade {
    
        fun parse(code: String) : ParsingResult = parse(code.toStream())
    
        fun parse(file: File) : ParsingResult = parse(FileInputStream(file))
    
        fun parse(inputStream: InputStream) : ParsingResult {
            val antlrParsingResult = SandyAntlrParserFacade.parse(inputStream)
            val lexicalAnsSyntaticErrors = antlrParsingResult.errors
            val antlrRoot = antlrParsingResult.root
            val astRoot = antlrRoot?.toAst(considerPosition = true)
            val semanticErrors = astRoot?.validate() ?: emptyList()
            return ParsingResult(astRoot, lexicalAnsSyntaticErrors + semanticErrors)
        }
    
    }

    在系统的其余部分中,我们将简单地调用SandyParserFacade,而无需直接调用ANTLR解析器。

    测试验证

    它会飞吗? 让我们验证一下。

    class ValidationTest {
    
        @test fun duplicateVar() {
            val errors = SandyParserFacade.parse("""var a = 1
                                                   |var a =2""".trimMargin("|")).errors
            assertEquals(listOf(Error("A variable named 'a' has been already declared at Line 1, Column 0", Point(2,0))), errors)
        }
    
        @test fun unexistingVarReference() {
            val errors = SandyParserFacade.parse("var a = b + 2").errors
            assertEquals(listOf(Error("There is no variable named 'b'", Point(1,8))), errors)
        }
    
        @test fun varReferenceBeforeDeclaration() {
            val errors = SandyParserFacade.parse("""var a = b + 2
                                                   |var b = 2""".trimMargin("|")).errors
            assertEquals(listOf(Error("You cannot refer to variable 'b' before its declaration", Point(1,8))), errors)
        }
    
        @test fun unexistingVarAssignment() {
            val errors = SandyParserFacade.parse("a = 3").errors
            assertEquals(listOf(Error("There is no variable named 'a'", Point(1,0))), errors)
        }
    
        @test fun varAssignmentBeforeDeclaration() {
            val errors = SandyParserFacade.parse("""a = 1
                                                   |var a =2""".trimMargin("|")).errors
            assertEquals(listOf(Error("You cannot refer to variable 'a' before its declaration", Point(1,0))), errors)
    
        }

    结论

    一切都很好:通过一个简单的调用,我们可以获得所有错误的列表。 对于他们每个人,我们都有一个描述和位置。 这对于我们的编译器已经足够了,但是我们现在需要在编辑器中显示这些错误。 我们将在以后的帖子中这样做。

    翻译自: https://www.javacodegeeks.com/2016/09/building-compiler-language-validation.html

    c语言编译器c语言编译器

    展开全文
  • 1. 定义词法单元Tag   首先要将可能出现的词进行分类,可以有不同的分类方式。如多符一类:将所有逗号、分号、括号等都归为一类,或者一符一类,将一个符号归为一类。我这里采用的是一符一类的方式。C代码如下: ...
  • 编译器词法分析

    2012-12-04 19:18:38
    c语言写的编译器词法分析器.输入一个文件的地址,输出一个词法分析文件.
  • expr.cppexpr.hexpr.olex.yy.clexer.lmakefileminicminic.hparser.yREADME.txtstmt.cppstmt.hstmt.osymbol.cppsymbol.hsymbol.otesttestfiletestfile2....\error.tar.gz....\error1.minic....\error10.minic....\err...
  • C语言编译器的Lex及Yacc词法及语法分析规则源码
  • /*词法分析结果Token序列的存储文件指针fp*/ extern FILE* fp; /*Token序列中的token数目*/ extern int Tokennum; /*清单的行号*/ extern int lineno; /*********************************************************...
  • 本节我们先从一个简易的可以识别四则运算和整数值的词法分析扫描器开始。它实现的功能也很简单,就是读取我们给定的文件,并识别出文件中的token将其输出。 这个简易的扫描器支持的词法元素只有五个: 四个基本的...
  • c语言编译器

    2015-06-22 19:43:30
    c语言写的一个编译器,主要包括词法分析和语法分析。
  • 词法分析与语法分析的原始文件扩展: ://www.quut.com/c/ANSI-C-grammar-l-1998.html和 实现了C语言除了struct和指针几乎所有的语法。 运行 环境要求:flex bison g ++ 11 python3 中间代码生成 Windows命令行输入:...
  • 简易C语言编译器.zip

    2020-01-06 18:56:13
    编译原理课程作业,简易C语言编译器,实现了词法分析,语法分析,语义分析,拉链回添(四元式),用windowbuilder做了一个简单的界面。
  • 这是一个关于C语言的一个子集的编译器,其中包括了一个编译器所包含的全部,有词法分析,语法分析,及token表的生成与显示,中间代码(三元式)及目标代码(汇编指令)的生成与显示。采用C++,MFC编译实现的可视化...
  • 这是我们大三的时候的一个编译器实践的课程设计,是将CMM语言(自行定义的一个C语言的子集)源程序进行词法分析、语法分析和最终编译运行,包括有源代码和相关文档,希望对初步学习编译器的同学有用,但不提倡直接拿...
  • tcc...\doc...\...\readme.txt...\...\tcc-doc....
  • C语言编译器

    2019-04-20 08:22:24
    实现了从词法分析、语法分析、抽象语法树生成、简单语法的语法树转四元式、以及四元式到汇编代码的过程。 需要下载flex、bison、DOSBox
  • c语言编译器源代码

    2013-01-16 01:11:34
    一个很不错的C语言编译器的源代码,包括词法分析、语法分析、中间代码生成等部分,对了解编译器很有帮助。
  • C语言实现词法分析

    千次阅读 多人点赞 2017-10-19 16:28:14
    我们都知道,要执行一个C语言的代码,要编译链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的启动...编译程序的工作过程可以划分为五个阶段:词法分析,语法分析,语
  • C语言编译器设与实现毕业论文设计北京邮电 大 学毕业设计(论文)任务书第1页毕业设计(论文)题目:C语言编译器设计与实现毕业设计(论文)要求及原始数据(资料):1.C语言简介和国内外编译器技术研究现状;2.深入了解...
  • C语言编译器,基本上实现了主要功能的C语言语法,词法分析使用状态转移,语法使用LR(1)方法,自动生成ACTION和GOTO转移表。自顶向下的语法制导翻译,可以生成各种类型的表达式(包括布尔,算术,逻辑等等),...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 534
精华内容 213
关键字:

c语言编译器词法分析

c语言 订阅