2

yyerror関数で行番号を出力しようとすると、エラーが発生します。私はOSXに取り組んでいます。

(compiler.lの行番号)

%{

#include "compiler.tab.h"
int lineNumber = 1;

%}
%%

int { return INT; }
float { return FLOAT; }
void { return VOID; }
do { return DO; }
while { return WHILE; }
if { return IF; }
return { return RETURN; }
else { return ELSE; }
\/\/(.)* { return COMMENT; }
\/\*(.)*\*\/ { return COMMENT; }
[a-zA-Z][a-zA-Z0-9_]* { return IDENT; }
[0-9]+\.[0-9]+ { sscanf(yytext, "%lf", &yylval.reell); return FVAL; }
[0-9]+ { yylval.integer = atoi(yytext); return IVAL; }
\( { return OPA; }
\) { return CPA; }
\{ { return OB; }
\} { return CP; }
\; { return SEMICOLON; }
\, { return COMMA; }
\! { return NOT; }
\-\- { return DECREMENT; }
\+\+ { return INCREMENT; }
\<\< { return LSHIFT; }
\=\= { return EQUALS; }
\<\= { return LTOE; }
\>\= { return GTOE; }
\&\& { return AND; }
\|\| { return OR; }
\= { return ASSIGNMENT; }
\< { return LT; }
\> { return GT; }
\/ { return DIVIDE; }
\* { return MULTIPLY; }
\+ { return PLUS; }
\- { return MINUS; }
[ ]+ { return BLNK; }
[\n]* { ++lineNumber; return NL; }

%%

コンパイラ.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "compiler.h"

extern int lineNumber;

int main (void)
{
    yyparse();
    return 0;
}

void yyerror(char * str)
{
    fprintf(stderr, "Error: %s, Line %d\n", str, lineNumber);
}

次のエラーメッセージが表示されます。

アーキテクチャx86_64の未定義のシンボル: "_ lineNumber"、参照元:compiler.o ldの_yyerror:アーキテクチャx86_64のシンボルが見つかりませんcollect2:ldが1つの終了ステータスを返しました

これは私がコンパイルするために使用するコマンド(シェルファイル)です:

#!/bin/bash

flex  compiler.l
bison -d compiler.y

gcc -g -c compiler.tab.c -o compiler_y.o
gcc -g -Wall -std=c99 -c lex.yy.c
gcc -g -c compiler.tab.c -o compiler_y.o

gcc -g -Wall -std=c99 -c compiler.c
gcc -g -o compiler compiler.o compiler_y.o lex.yy.o -lm -lfl
4

1 に答える 1

6

%option yylinenoフレックスソースで使用でき、変数int yylinenoは現在のトークンの行番号を提供します。yylineno一般にトークナイザーはパーサーよりも先にあるため、文法 (bison/yacc)から使用しないように注意してください。パーサーで行番号を使用する場合、通常、行番号はトークンに関連付けられているため、パーサーはトークンを介してアクセスできます。

このエラー メッセージは、 をリンクしていないことが原因である可能性が高く、その上で実行してから C コンパイラを介して渡すことによってcompiler.tab.o取得されます。compiler.lflex

于 2013-03-15T13:43:23.410 に答える