Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> грамматика условия, грамматика условия, используемая в прогр 
:(
    Опции темы
fuckingniger
Дата 29.3.2011, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



помогите написать грамматику для условного оператора(например паскалевского оператора)
я навоял тут кое-что - но как-то не совсем правильно работает(не при всех у словиях)

/
Код

/для условий
usl_oper:            bol | men | b_r | m_r |b_m
usl_value:            true | false 
usl_join:            and|or|xor
usl_operation:        usl_join | usl_oper
uslovie:             usl_operand spc usl_operation spc  usl_operand | l_s spc uslovie spc r_s 
usl_op_t1 :            usl_value | word 
usl_operand:        l_s spc usl_operand spc r_s | usl_operand1  
usl_operand1:        l_s spc uslovie spc r_s | usl_op_t1 



spc - любое количество(может быть и ноль) пробелов и табов в произвольном порядке 
l_s и r_s - скобки
word - любое незарезервированное слово

вроде остальное должно быть понятно

Добавлено через 49 секунд
P.S. это бизон
PM MAIL   Вверх
xvr
Дата 29.3.2011, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Это не бизон - это жуть в полоску  smile 
В бизоне есть понятие приоритетов операций, не надо все расписывать поэлементно. И откуда у вас там пробелы взялись (spc) - они еще на этапе выделения лексем должны были быть удалены.

Вот, кусок реального файла:
Код

%token vID
%token vSTR
%token vINT

%left ','
%right '=' tASSIGN
%right '?'
%left tOR
%left tAND
%left '|'
%left '^'
%left '&'
%left tEQ tNE
%left tGE '>' tLE '<'
%left tSHR tSHL tSRA
%left '+' '-'
%left '*' '/' '%'
%left tIN
%right tPP tMM
%right UNOP
%left '.'
%left STR_CAT

%%

expression:
        _expression
      | '(' '{' script_body1 '}' ')' {$$=$3;}
      ;

un_expr:
        vINT                  {$$=new IntConst($1);}
      | vID                   {$$=get_op_by_id($1);}
      | str_const             {$$=new StrConst($1);}
      | '(' expression ')'    {$$=$2;}
      ;

_expression:
        un_expr
      | expression '*' expression {$$=newBinOp(COP_mul, $1,$3);}
      | expression '/' expression {$$=newBinOp(COP_div, $1,$3);}
      | expression '%' expression {$$=newBinOp(COP_mod, $1,$3);}
      | expression '+' expression {$$=newBinOp(COP_add, $1,$3);}
      | expression '-' expression {$$=newBinOp(COP_sub, $1,$3);}
      | expression '>' expression {$$=newBinOp(COP_gt, $1,$3);}
      | expression '<' expression {$$=newBinOp(COP_lt, $1,$3);}
      | expression tEQ expression {$$=newBinOp(COP_eq, $1,$3);}
      | expression '&' expression {$$=newBinOp(COP_and, $1,$3);}
      | expression '^' expression {$$=newBinOp(COP_xor, $1,$3);}
      | expression '|' expression {$$=newBinOp(COP_or, $1,$3);}
      | expression tSHR expression {$$=newBinOp(COP_shr, $1,$3);}
      | expression tSHL expression {$$=newBinOp(COP_shl, $1,$3);}
      | expression tGE expression  {$$=newBinOp(COP_ge, $1,$3);}
      | expression tLE expression  {$$=newBinOp(COP_le, $1,$3);}
      | expression tNE expression  {$$=newBinOp(COP_ne, $1,$3);}
      | expression tOR expression  {$$=newBinOp(COP_lor, $1,$3);}
      | expression tAND expression {$$=newBinOp(COP_land, $1,$3);}
      | expression ',' expression  {$$=$1->append($3);}

      | '!'    un_expr %prec UNOP  {$$=newUnOp(COP_linv,$2);}
      | '~'    un_expr %prec UNOP  {$$=newUnOp(COP_not,$2);}
      | '-'    un_expr %prec UNOP  {$$=newUnOp(COP_neg,$2);}
      | '+'    un_expr %prec UNOP  {$$=$2;}
      | tPP vID        %prec tPP   {$$=newUnOp(COP_ppv,get_op_by_id($2));}
      | vID tPP        %prec tPP   {$$=newUnOp(COP_vpp,get_op_by_id($1));}
      | tMM vID        %prec tMM   {$$=newUnOp(COP_mmv,get_op_by_id($2));}
      | vID tMM        %prec tMM   {$$=newUnOp(COP_vmm,get_op_by_id($1));}

      | vID '(' param_list ')' {$$=newCall($1,$3);}
      | expression '.' vID '(' param_list ')' %prec '.' 
         {$$=newCall($3,(new ParamDef($1))->append($5));}

      | vID tASSIGN expression {$$=new AssignOp($2,$1,$3);}
      | vID '=' expression     {$$=new AssignOp(COP_ass,$1,$3);}

      | expression tIN '[' param_list ']' {$$=new InOp($1,$4);}

      | expression '?' expression ':' expression %prec '?'
        {$$=new IfStmt($1,$3,$5);}
      ;



PM MAIL   Вверх
fuckingniger
Дата 29.3.2011, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



нееееее....у меня бизон в паре с флексом работает. флекс делает лексический анализ исходного текста(распознать заданные некоторой грамматикой усовия), а бизон должен сделать синтаксический анализ.

Добавлено @ 22:00
могу весь код привести чтоб понятнее было.

вот флексовская грамматика:
Код

%option noyywrap
%option yylineno
%option never-interactive
%option c++
using namespace std;

%{

#include <stdio.h>
#include <string>
#include "tokens.h"

std::string tmpstr = "";

%}
letters        [a-zA-Z]
digit        [0-9]
number        ({digit})*
space        [\x20]
dif_space    ({space})*
tab        [\t]
t        [\x2E]
z        [\x2C]
t_t        [\x3A]
t_z        [\x3B]
l_s        [\x28]
r_s        [\x29]
word        ({letters})*
bol        [\x3E]
men        [\x3C]    
ravno    [\x3D]
add        [\x2B]
sub        [\x2D]
div        [\x2F]
mul        [\x2A]
prisvoenie    ({t_t}{ravno})
apostr        [\x27]


b_r        ({bol}{ravno})
m_r        ({men}{ravno})
b_m        ({bol}{men})

enter              \n

Ap_program    program
Ap_integer    integer
Ap_char        character
Ap_real    real
Ap_begin    begin
Ap_end        end
Ap_for        for
Ap_while    while
Ap_until    until
Ap_then        then
Ap_repeat    repeat
Ap_writeln    writeln
Ap_readln    readln
Ap_sqr        sqr
Ap_sqrt        sqrt
Ap_sin        sin
Ap_cos        cos
Ap_ln        ln
Ap_abs        abs
Ap_var        var
Ap_func        function
Ap_proc        procedure
Ap_bool        boolean
Ap_if        if
Ap_else        else
Ap_do        do
Ap_true        true
Ap_false    false
Ap_or        or    
Ap_xor        xor
Ap_not        not
Ap_and        and
%%




{number}    {
            yylval.string = strdup(yytext);
            return Q_number;
        }

{dif_space}    {
            yylval.string = strdup(yytext);
            return Q_dif_space;
        }

{tab}        {
            yylval.string = strdup(yytext);
            return Q_tab;
        }

{t}            {
            yylval.string = strdup(yytext);
            return Q_t;
        }

{z}            {
            yylval.string = strdup(yytext);
            return Q_z;
        }

{t_t}            {
            yylval.string = strdup(yytext);
            return Q_t_t;
        }

{t_z}            {
            yylval.string = strdup(yytext);
            return Q_t_z;
        }
        
{l_s}            {
            yylval.string = strdup(yytext);
            return Q_l_s;
        }

{r_s}    {
            yylval.string = strdup(yytext);
            return Q_r_s;
        }


{bol}    {
            yylval.string = strdup(yytext);
            return Q_bol;
        }

{men}    {
            yylval.string = strdup(yytext);
            return Q_men;
        }

{Ap_true}        {
            yylval.string = strdup(yytext);
            return Q_true;
        }
{Ap_false}        {
            yylval.string = strdup(yytext);
            return Q_false;
        }
{ravno}        {
            yylval.string = strdup(yytext);
            return Q_ravno;
        }

{add}    {
            yylval.string = strdup(yytext);
            return Q_add;
        }

{sub}    {
            yylval.string = strdup(yytext);
            return Q_sub;
        }

{div}    {
            yylval.string = strdup(yytext);
            return Q_div;
        }

{mul}            {
            yylval.string = strdup(yytext);
            return Q_mul;
        }

{prisvoenie}        {
            yylval.string = strdup(yytext);
            return Q_prisvoenie;
        }

{apostr}    {
            yylval.string = strdup(yytext);
            return Q_apostr;
        }

{b_r}        {
            yylval.string = strdup(yytext);
            return Q_b_r;
        }

{m_r}        {
            yylval.string = strdup(yytext);
            return Q_m_r;
        }

{b_m}        {
            yylval.string = strdup(yytext);
            return Q_b_m;
        }

{enter}        {
            yylval.string = strdup(yytext);
            return Q_enter;
        }

{Ap_program}    {
            yylval.string = strdup(yytext);
            return Q_proqram;
        }

{Ap_integer}    {
                yylval.string = strdup(yytext);
                return Q_integer;
        }
{Ap_char}    {
                yylval.string = strdup(yytext);
                return Q_char;
                }
{Ap_real}        {
            yylval.string = strdup(yytext);
            return Q_real;
        }

{Ap_begin}    {
            yylval.string = strdup(yytext);
            return Q_begin;
        }

{Ap_end}    {
            yylval.string = strdup(yytext);
            return Q_end;
        }

{Ap_for}    {
            yylval.string = strdup(yytext);
            return Q_for;
        }

{Ap_while}    {
            yylval.string = strdup(yytext);
            return Q_while;
        }


{Ap_until}    {
            yylval.string = strdup(yytext);
            return Q_until;
        }


{Ap_then}    {
            yylval.string = strdup(yytext);
            return Q_then;
        }


{Ap_end}    {
            yylval.string = strdup(yytext);
            return Q_end;
        }


{Ap_repeat}    {
            yylval.string = strdup(yytext);
            return Q_repeat;
        }


{Ap_writeln}    {
            yylval.string = strdup(yytext);
            return Q_writeln;
        }
{Ap_readln}    {
            yylval.string = strdup(yytext);
            return Q_read;
        }


{Ap_sqr}    {
            yylval.string = strdup(yytext);
            return Q_sqr;
        }


{Ap_sqrt}    {
            yylval.string = strdup(yytext);
            return Q_sqrt;
        }


{Ap_sin}    {
            yylval.string = strdup(yytext);
            return Q_sin;
        }


{Ap_cos}    {
            yylval.string = strdup(yytext);
            return Q_cos;
        }


{Ap_ln}        {
            yylval.string = strdup(yytext);
            return Q_ln;
        }


{Ap_abs}    {
            yylval.string = strdup(yytext);
            return Q_abs;
        }


{Ap_var}    {
            yylval.string = strdup(yytext);
            return Q_var;
        }



{Ap_func}    {
            yylval.string = strdup(yytext);
            return Q_func;
        }



{Ap_proc}    {
            yylval.string = strdup(yytext);
            return Q_proc;
        }


{Ap_bool}    {
            yylval.string = strdup(yytext);
            return Q_bool;
        }


{Ap_if}    {
            yylval.string = strdup(yytext);
            return Q_if;
        }


{Ap_else}    {
            yylval.string = strdup(yytext);
            return Q_else;
        }

{Ap_do}        {
            yylval.string = strdup(yytext);
            return Q_do;
        }
{Ap_and}        {
            yylval.string = strdup(yytext);
            return Q_and;
        }
{Ap_or}        {
            yylval.string = strdup(yytext);
            return Q_or;
        }
{Ap_xor}        {
            yylval.string = strdup(yytext);
            return Q_xor;
        }
{Ap_not}        {
            yylval.string = strdup(yytext);
            return Q_not;
        }

{word}        {
            yylval.string = strdup(yytext);
            return Q_word;
        }

{space}        {
            
        }

%%


а вот бизоновская(то, что я сделал):



Код

%{
#include <iostream>
#include <stdlib.h>
using namespace std;
extern int debug;

void yyerror(char const* msg);

int yylex();

int lineno();

%}

%union {
    char    *string;     /* string buffer for token values */
}
%token <string> 
 Q_number    
 Q_dif_space 
 Q_tab            
 Q_t        
 Q_z        
 Q_t_t        
 Q_t_z        
 Q_l_s        
 Q_r_s        
 Q_word        
 Q_bol         
 Q_men        
 Q_ravno    
 Q_add        
 Q_sub        
 Q_div        
 Q_mul        
 Q_prisvoenie 
 Q_apostr    
 Q_b_r        
 Q_m_r        
 Q_b_m        
 Q_enter    
 Q_proqram    
 Q_integer    
 Q_real        
 Q_begin    
 Q_end        
 Q_for        
 Q_while    
 Q_until    
 Q_then        
 Q_char        
 Q_repeat    
 Q_writeln    
 Q_sqr        
 Q_sqrt        
 Q_sin        
 Q_cos        
 Q_ln        
 Q_abs        
 Q_var        
 Q_func        
 Q_proc        
 Q_bool        
 Q_if        
 Q_else        
 Q_read    
 Q_do    
 Q_true
 Q_false
 Q_and
 Q_or
 Q_xor
 Q_not
  
%%
aksioma : header varing string str uslovie
{
cout  <<endl; 
};

//флексовские
number : Q_number
{
cout  <<$1 ; 
};


dif_space : Q_dif_space
{
cout  <<$1 ; 
};

tab : Q_tab
{
cout  <<$1 ; 
};

t : Q_t
{
cout  <<$1 ; 
};

z : Q_z
{
cout  <<$1 ; 
};

t_t : Q_t_t
{
cout  <<$1 ; 
};

t_z : Q_t_z
{
cout  <<$1 ; 
};

l_s : Q_l_s
{
cout  <<$1 ; 
};

r_s : Q_r_s
{
cout  <<$1 ; 
};
word : Q_word
{
cout  <<$1 ; 
};

bol : Q_bol
{
cout  <<$1 ; 
};

men : Q_men
{
cout  <<$1 ; 
};

ravno : Q_ravno
{
cout  <<$1 ; 
};

add : Q_add
{
cout  <<$1 ; 
};

sub :Q_sub
{
cout  <<$1 ; 
};

div : Q_div
{
cout  <<$1 ; 
};

mul :  Q_mul
{
cout  <<$1 ; 
};

prisvoenie :Q_prisvoenie
{
cout  <<$1 ; 
};

apostr : Q_apostr
{
cout  <<$1 ; 
};

b_r     : Q_b_r    
{
cout  <<$1 ; 
};

m_r     : Q_m_r    
{
cout  <<$1 ; 
};

b_m : Q_b_m
{
cout  <<$1 ; 
};

enter : Q_enter
{
cout  <<$1 ; 
};

program :Q_proqram
{
cout  <<$1 ; 
};

integer : Q_integer
{
cout  <<$1 ; 
};

real : Q_real
{
cout  <<$1 ; 
};

begin: Q_begin
{
cout  <<$1 ; 
};

end: Q_end
{
cout  <<$1 ; 
};

for: Q_for
{
cout  <<$1 ; 
};
whiler : Q_while
{
cout  <<$1 ; 
};
until : Q_until
{
cout  <<$1 ; 
};
then :Q_then    
{
cout  <<$1 ; 
};
char    : Q_char    
{
cout  <<$1 ; 
};
repeat :  Q_repeat
{
cout  <<$1 ; 
};
writeln: Q_writeln
{
cout  <<$1 ; 
};
sqr : Q_sqr
{
cout  <<$1 ; 
};
sqrt    : Q_sqrt    
{
cout  <<$1 ; 
};
sin : Q_sin
{
cout  <<$1 ; 
};
cos : Q_cos
{
cout  <<$1 ; 
};
ln :  Q_ln
{
cout  <<$1 ; 
};

abs : Q_abs
{
cout  <<$1 ; 
};
var : Q_var
{
cout  <<$1 ; 
};
func :Q_func
{
cout  <<$1 ; 
};
proc : Q_proc
{
cout  <<$1 ; 
};
bool     : Q_bool    
{
cout  <<$1 ; 
};
if     : Q_if    
{
cout  <<$1 ; 
};
else     :Q_else    
{
cout  <<$1 ; 
};

read :Q_read
{
cout  <<$1 ; 
};
do : Q_do
{
cout  <<$1 ; 
};
true :Q_true
{
cout  <<$1 ; 
};
false :Q_false
{
cout  <<$1 ; 
};
and :Q_and
{
cout  <<$1 ; 
};
or :Q_or
{
cout  <<$1 ; 
};
xor :Q_xor
{
cout  <<$1 ; 
};
not :Q_not
{
cout  <<$1 ; 
};

////////////////////////////////////////////

spc1:      dif_space
dif_tab:    tab dif_tab |tab
tab1:       |dif_tab
temp:         spc1|tab1
spc:        spc temp|temp
ent:        |ent1
ent1:        enter ent1| enter
header:        program spc1 word spc t_z ent
varing:        var spc ent new_per_many 
type:        integer | real | char | bool
new_per:    spc word spc t_t spc type spc t_z ent
new_per_many: new_per new_per_many | new_per
string:        apostr str apostr
wrd:        | word
temp_str:    temp | ent  | wrd
str:        str temp_str| temp_str
//для условий
usl_oper:            bol | men | b_r | m_r |b_m
usl_value:            true | false 
usl_join:            and|or|xor
usl_operation:        usl_join | usl_oper
uslovie:             usl_operand spc usl_operation spc  usl_operand | l_s spc uslovie spc r_s 
usl_op_t1 :            usl_value | word 
usl_operand:        l_s spc usl_operand spc r_s | usl_operand1  
usl_operand1:        l_s spc uslovie spc r_s | usl_op_t1 





/*uslovie:            usl_alone_skobki
usl_oper:            bol | men | b_r | m_r
usl_join:            and|or|xor|not
usl_alone:               word | word  spc usl_oper spc word   | usl_two_join 
usl_alone_skobki:     usl_value | usl_alone  |l_s spc  usl_alone_skobki spc  r_s
usl_value:            true | false 
usl_two_join:        l_s spc usl_alone_skobki spc  usl_join spc usl_alone_skobki spc r_s
usl_two_join_skobki:    l_s usl_two_join r_s | l_s usl_two_join_skobki r_s
*/


Добавлено через 10 минут и 42 секунды
просто у меня не получается задать грамматику для условного оператора.

вот например такая строка работает:
Код

program lol ;
var
a:integer ;
b:boolean ;
c:character ;


'test    strindg '    
(    (c    <(    a>    b    )    )<    r    )

а такая нет - не понимаю, по каким -таким разным правилам это может выполняться:
Код

program lol ;
var
a:integer ;
b:boolean ;
c:character ;


'test    strindg '    
(    (c    <(    a>    b    )    )        <    r    )


Добавлено через 12 минут и 47 секунд
разница в этих строках в этом месте:

Код

a>    b    )    )<    r

Код

a>    b    )    )        <    r

 там 2 таба.Если поставить пробел, то это ничего не поменяет

Это сообщение отредактировал(а) fuckingniger - 29.3.2011, 22:01
PM MAIL   Вверх
xvr
Дата 30.3.2011, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



У вас пробелы (и табы) являются значимыми элементами грамматики. Если сможете внятно объяснить зачем - то возможно сможете и разницу в строках объяснить.

(Во 2й строке между r_s и men у вас вставлено spc - по этому и не работает)

Цитата(fuckingniger @  29.3.2011,  21:57 Найти цитируемый пост)
у меня бизон в паре с флексом работает.

Да хоть с флюсом  smile Нафига бизону знать какими пробелами были разделены значащие лексемы?

Цитата(fuckingniger @  29.3.2011,  21:57 Найти цитируемый пост)
а бизон должен сделать синтаксический анализ.

Именно, а не заниматься попутно вычесыванием мусора из потока лексем от флекса

PM MAIL   Вверх
fuckingniger
Дата 31.3.2011, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



Цитата(xvr @  30.3.2011,  11:09 Найти цитируемый пост)
Цитата(fuckingniger @  29.3.2011,  21:57 )а бизон должен сделать синтаксический анализ.Именно, а не заниматься попутно вычесыванием мусора из потока лексем от флекса

Это крайне любопытно.
то есть если я исключу из флекса(и из бизона соответственно ) пробелы, энтеры, табы, то бизон не будет выдавать ошибку???(если на входе в бизон будет строка с пробелами ....)


Цитата(xvr @  30.3.2011,  11:09 Найти цитируемый пост)
(Во 2й строке между r_s и men у вас вставлено spc - по этому и не работает)


я расчитывал на то что 
Код

(c    <(    a>    b    )    )


будет распознано как 
Код

usl_operand


Это сообщение отредактировал(а) fuckingniger - 31.3.2011, 13:00
PM MAIL   Вверх
fuckingniger
Дата 31.3.2011, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



всё таки пробелы нужны. Для того чтобы использовать символьные пременные, строки.
PM MAIL   Вверх
fuckingniger
Дата 31.3.2011, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



объясните пожалуйста, в чем у меня ошибка и почему он не воспринимает 
Код

(c    <(    a>    b    )    )


как 
Код

usl_operand

PM MAIL   Вверх
xvr
Дата 31.3.2011, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(fuckingniger @  31.3.2011,  13:19 Найти цитируемый пост)
всё таки пробелы нужны. Для того чтобы использовать символьные пременные, строки. 
Для этого пробелы не нужны. Выкините в вашем flex'е строки с 88 по 96

Цитата(fuckingniger @  31.3.2011,  12:59 Найти цитируемый пост)
то есть если я исключу из флекса(и из бизона соответственно ) пробелы, энтеры, табы, то бизон не будет выдавать ошибку???
Да

Цитата(fuckingniger @  31.3.2011,  15:29 Найти цитируемый пост)
объясните пожалуйста, в чем у меня ошибка

Дайте bison'у ключик -v, при компиляции того, что получилось укажите дефайн YYDEBUG (в 1) 
и в где нибудь тексте 
Код

extern int yydebug;

yydebug=1;
и он вам сам все расскажет

PM MAIL   Вверх
fuckingniger
Дата 31.3.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



Цитата(xvr @  31.3.2011,  16:02 Найти цитируемый пост)
Дайте bison'у ключик -v


я не знаю, как это сделать

Добавлено через 45 секунд
или define это и сделает?
PM MAIL   Вверх
fuckingniger
Дата 31.3.2011, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



Код

1>main.obj : error LNK2001: неразрешенный внешний символ ""int yydebug" (?yydebug@@3HA)"
1>C:\Users\redwhite\Documents\Visual Studio 2010\Projects\курсовик_бизон - копия\Debug\курсовик_бизон.exe : fatal error LNK1120: 1 неразрешенных внешних элементов

PM MAIL   Вверх
xvr
Дата 31.3.2011, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(fuckingniger @ 31.3.2011,  16:53)
Цитата(xvr @  31.3.2011,  16:02 Найти цитируемый пост)
Дайте bison'у ключик -v


я не знаю, как это сделать

Найдите, где у вас запускается bison и в командную строку добавьте -v

Цитата

Добавлено @ 16:53
или define это и сделает?
Нет, не сделает

Цитата

1>main.obj : error LNK2001: неразрешенный внешний символ ""int yydebug" (?yydebug@@3HA)"
Тогда напишите вместо extern int yydebug; 
Код

extern "C" int yydebug;
И ключик все же bison'у подайте - без него этой переменной не будет

PM MAIL   Вверх
fuckingniger
Дата 1.4.2011, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



я делал с параметрами -d -o
в результате создавалось 2 файлика .cpp и .cpp.h
и содержание .cpp.h очень-очень напоминает (даже полностью  -v.h), клторый сделан был по вашему совету.
написал
Код

 extern "C" int yydebug;

и ошибки пропали.

только не понимаю как это мне поможет .

Добавлено через 7 минут и 3 секунды
Цитата(xvr @  31.3.2011,  16:02 Найти цитируемый пост)
и он вам сам все расскажет


Добавлено через 7 минут и 27 секунд
???
PM MAIL   Вверх
xvr
Дата 1.4.2011, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(fuckingniger @  1.4.2011,  02:51 Найти цитируемый пост)
только не понимаю как это мне поможет 

Присвойте 1 в yydebug где нибудь перед вызовом парсера. 
PS. Программа должна быть консольная, трасса парсинга выводится обычными printf'ами

PM MAIL   Вверх
fuckingniger
Дата 1.4.2011, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 1.10.2010

Репутация: нет
Всего: 1



я с проектами напутал. на самом деле 
Код

1>main.obj : error LNK2001: неразрешенный внешний символ "_yydebug"
1>C:\Users\redwhite\Documents\Visual Studio 2010\Projects\курсовик_бизон - копия\Debug\курсовик_бизон.exe : fatal error LNK1120: 1 неразрешенных внешних элементов




в main.cpp написал


Код

#include <fstream>
//#include <string>

#include "FlexLexer.h"

using namespace std;



extern "C" int yydebug;

yyFlexLexer* lexer = NULL; //this is reference to global scanner 



Код

int main()
{
    setlocale(LC_ALL,"rus");
    ifstream infile("stdin");
    yydebug=1;
    lexer = new yyFlexLexer(&infile);    
.....

Добавлено через 4 минуты и 58 секунд
не помогло 
Код

extern "C" int yydebug;

PM MAIL   Вверх
mes
Дата 1.4.2011, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(fuckingniger @  1.4.2011,  11:31 Найти цитируемый пост)
на самом деле 

Код

extern "C" int yydebug=1; 

без инициализации вы объявляете, а не определяете переменную


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0836 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.