Compiler construction 语法实现中的文件结尾描述符

Compiler construction 语法实现中的文件结尾描述符,compiler-construction,grammar,parsing,Compiler Construction,Grammar,Parsing,我正在编写一个编译器实现,希望检查是否已到达文件末尾 我知道这可以使用lex文件中的yywrap()函数来完成,但要求是,如果EOF被显式定义为十六进制值0x1a,那么我们如何引用它 例如: main() { printf(“Check EOF marker\n”);“0x1a”使您的lexer为EOF返回一个令牌 我建议您退回两种情况下的代币: getc()返回-1(通常的EOF符号)。在这种情况下,将令牌文本设为空 getc()返回了'\x1a'。在这种情况下,请将此字符放在令牌文本中 这允

我正在编写一个编译器实现,希望检查是否已到达文件末尾

我知道这可以使用lex文件中的yywrap()函数来完成,但要求是,如果EOF被显式定义为十六进制值0x1a,那么我们如何引用它

例如:

main() {
printf(“Check EOF marker\n”);“0x1a”使您的lexer为EOF返回一个令牌

我建议您退回两种情况下的代币:

  • getc()
    返回
    -1
    (通常的EOF符号)。在这种情况下,将令牌文本设为空

  • getc()
    返回了
    '\x1a'
    。在这种情况下,请将此字符放在令牌文本中


  • 这允许您的语法区分这两种情况。

    使您的lexer为EOF返回一个令牌

    我建议您退回两种情况下的代币:

  • getc()
    返回
    -1
    (通常的EOF符号)。在这种情况下,将令牌文本设为空

  • getc()
    返回了
    '\x1a'
    。在这种情况下,请将此字符放在令牌文本中


  • 这使您的语法能够区分这两种情况。

    您的配置是什么?我知道您使用lex进行扫描,使用yacc进行解析。为什么不让lex读取EOF字符并返回给yacc一个专门的EOF令牌?您的配置是什么?我知道您使用lex进行扫描,使用yacc进行解析。为什么不让lex读取EOF字符并返回给yacc读取EOF字符并向yacc返回专用EOF标记?
    print    :    print_stmt '(' stmt_valid ')' colon '\n' 
    {
        OK do the rest
    }
             |    print_stmt '(' stmt_valid ')' colon end_indicator
    {
        print error message and close application.
    }