Red de conocimientos sobre prescripción popular - Enciclopedia de Medicina Tradicional China - Haga preguntas sobre Lex y Yacc en las herramientas de desarrollo del generador de analizadores.

Haga preguntas sobre Lex y Yacc en las herramientas de desarrollo del generador de analizadores.

Este artículo presenta principalmente "Preguntas sobre Lex y Yacc en la herramienta de desarrollo del generador de analizadores", que involucran principalmente preguntas sobre Lex y Yacc en la herramienta de desarrollo del generador de analizadores. Los estudiantes que estén interesados ​​en hacer preguntas sobre Lex y Yacc en la herramienta de desarrollo del generador de analizadores pueden consultarla.

Nota: la expresión es de tipo doble, stringexp es de tipo char *.

Propósito: Implementar el modo de entrada mixto de calculadora y cadena.

Estado: Se han implementado la calculadora simple y la expresión de sintaxis ADD stringexp (por ejemplo: 3+4+"sdfe").

Problema: La combinación del tipo de cadena char * en sí y su combinación con el tipo de calculadora doble, es decir, la sintaxis de expresión stringexp ADD stringexp y stringexp ADD no están implementadas. En las pruebas multipartitas, creo que es un problema con su análisis y construcción de sintaxis, pero nunca he podido encontrar la causa raíz. Entonces espero que puedas darme algunas sugerencias, gracias.

Clave: Los segmentos de código marcados 1 y 2 están en negrita y subrayados. Si el comentario no está marcado, la prueba indica que el valor de la cadena no se puede pasar a la declaración final.

El código es el siguiente:

/////////////Archivo de encabezado ch3hdr.h

#Define NSYMS 20

Tabla de símbolos de estructura {

char * nombre

int tipo;

doble(* funcptr)();

Valor doble;

char * str

} symtab[NSYMS];

struct symtab * symlook();

/ /// ///////////Análisis léxico mylexer.l

%{

#Incluir " myparser.h "

# incluir & ltstdio .h & gt

# incluir & ltstdlib.h & gt

#Incluir "ch3hdr.h"

# incluir & ltmath.h & gt

p>

%}

%%

([0-9]+|([0-9]*\.[0-9] +)([eE ][-+]? [0-9]+)?) {

yylval . dval = atof(YY text); //itoa

Cantidad devuelta. ;}

[\ t];

"+" { return ADD;}

"-"{ return DEC;}

"*"{ return MUL;}

"/"{ return DIV;}

"(" { return LPAR}

")"{return RPAR;}

" = " {return QUE;}

","{return comma;}

"$"{ return 0;}

//[\"]([A-Za-z0-9 ]*)[\"] {

[\"]([^\"]*)[\" ] {

yylval.sval = yytext

Cadena de retorno;}

[A-Za-z][A-Za-z0-9]* {

struct symtab * sp = symlook(YY text);

yylval.symp = sp

Nombre de retorno;}

[ . \n]Devuelve texto YY[0];

%%

///////////////////Analizar mi analizador .

%{

#Incluir "mylexer.h"

#Incluir "ch3hdr.h"

# incluir & ltstring.h & gt

# incluir & ltmath.h & gt

# incluir & ltstdio.h & gt

# incluir & ltstdlib.h & gt

# define MAXBUFF 100

%}

% unión {

doble dval

char * sval

struct symtab * symp

}

% token & ltsymp & gtname

% token & ltdval & gtnumber

% token & ltsval & gt line

%token QUE agregar DEC MUL DIV LPAR RPAR coma

%left más decimal

%left división multiplicada

% aluminio sin sacarosa

% ty

pe & ltdval & gt significa

% tipo & ltsval & gtstringexp

%%

Statement_list: declaración ' \n '

| Declaración_lista de declaraciones '\n'

Declaración: expresión QUE denominada { $1->; $1->; ; nombre, $3); }

| nombre QUE cadenaexp { $1->; valor = 0; cadena %; s es %s\n ", $1->nombre, $1->str);}

| expresión { printf(" expresión = % g \ n ", $ 1); }

| cadena exp { printf(" cadena exp = % s \ n ", $ 1 }

cadena XP:expresión AGREGAR cadena p>

//| { $ $ =(char *)malloc(sizeof(char *)max buff); sprintf($$, " %s%s\n ", $1, $ 3 } - 1

/); /| cadena exp AGREGAR expresión { $ $ =(char *)malloc(sizeof(char *)max buff } - 2

| strrev (strn set(strrev(strn set($ 1); ), ' ', 1)), '', 1); sprintf ($$, " %s ", $ 1 }

expresión: expresión AGREGAR expresión { $ $ = $ 1+$); 3;}

| NÚMERO { $ $ = $ 1;}

| expresión expresión DEC { $ $ = $ 1-$ 3;}

| expresión expresión MUL { $ $ = $ 1 * $ 3;}

|expresión expresión DIV {

if ($3= 0.0)

yyerror("divide por cero");

Otro

$$ = $1 / $3;

}

}

p>

| expresión DEC % prec UMINUS { $ $ =-$ 2;}

| expresión LPAR RPAR { $ $ = $ 2;}

| ->valor}

|nombre lpar expresión rpar {

if($1->funcptr)

$ $=($1->funcptr)($3) ;

En caso contrario{

printf("%s no es una función\n", $1->nombre) ;

$$=0.0;

}

}

|Nombre expresión LPAR expresión coma RPAR {

if($1->funcptr)

$ $ =($1->funcptr)($3,$5);

De lo contrario {

printf("%s no es una función\n ", $ 1-& gt; nombre

$$=0.0;

p>

}

}

%%

Tabla de símbolos de estructura * tabla de símbolos (carácter)

{

struct symtab * sp

for(sp = symtab;sp & lt& ampsymtab[NSYMS];sp++)

{

if(sp- >Nombre& strcmp(sp->Nombre)

return sp;

if (!sp->Nombre)

{

sp-& gt;nombre = strdup(s);

Devolver sp;

}

}

yyerror("Demasiados símbolos");

Salir (1);

}

addfunc(char *nombre, doble ( *func)( ))

{

struct symtab * sp = symlook(nombre);

sp-& gt;

Principal (nulo)

{

doble externo sqrt(), exp(), log(), atan2(), fmod();

addfunc("sqrt",sqrt);

addfunc("exp",exp);

addfunc("log",log

);

addfunc("atan2 ", atan 2);

addfunc("fmod ", fmod);

YY parse(); /p>

Reimprimir

上篇: La receta del acento local de Arada 下篇: ¿Qué hacer ante la iritis y las adherencias? Si la iritis no se trata a fondo, puede reaparecer fácilmente. El método de tratamiento general es: dilatación, que puede prevenir la adhesión del iris y aliviar el espasmo del esfínter y del músculo ciliar. Utilice atropina al 1% como gotas para los ojos. Además, las hormonas pueden reducir la inflamación, así que utilice 0,1 dexametasona o 0,5 cortisona. Los siguientes artículos son para su referencia: 8 enfermedades oculares propensas a mal pronóstico. Primero, los síntomas de la iritis son los mismos que los de la conjuntivitis (médicamente llamada conjuntivitis aguda), donde los ojos se enrojecen. Por lo tanto, la antigua experiencia sugiere que también se trata de conjuntivitis. Simplemente toma un poco de loción antiinflamatoria durante unos días y todo estará bien. Si no se cura, se curará al séptimo día. Este enfoque es incorrecto. La razón del error es que no entiendo la diferencia entre las dos enfermedades: la conjuntivitis tiene muchas cantáridas y la iritis no tiene ninguna; los ojos rojos son más claros que la película blanca alrededor del ojo; Las ojeras, y la iritis es especial aquí. Roja, como una banda roja alrededor de las ojeras. La enfermedad del iris es una de las emergencias oculares. Se desarrolla rápidamente y puede provocar sinequias pupilares posteriores y atresia, que fácilmente pueden provocar ceguera. Hay que recordar que los celos sin ántrax son una enfermedad grave: la iritis. Los celos en las comisuras de los ojos son en su mayoría una enfermedad leve: la conjuntivitis. En segundo lugar, la queratitis purulenta suele aparecer en las zonas rurales. A menudo, debido a que algo toca los ojos o los entrecierra, las ojeras se rompen e inmediatamente los ojos tienen mucho miedo a la luz, las lágrimas y el dolor. Sin embargo, las ojeras (médicamente llamadas córneas) aún se pueden ver claramente con el ojo. ojo desnudo de. La vieja experiencia de la gente es que es normal tener lágrimas en los ojos y que mejorará en unos días, por lo que abandonan el tratamiento. Como resultado, unos días después, los síntomas oculares empeoraron, se veían cápsulas de pus de color blanco amarillento en las ojeras y la visión se volvió borrosa. El examen con lámpara de microhendidura en un hospital especializado reveló desprendimiento epitelial y lesiones infecciosas grises en forma de aguja en la córnea, lo que sugiere que fue causado por queratitis. Así que recuerde, si se encuentra con la situación anterior, primero debe ir al hospital para que lo examinen y ver si se trata de la etapa inicial de queratitis purulenta. Una vez que la enfermedad se diagnostica erróneamente, la supuración corneal puede complicarse fácilmente con una iritis reactiva y los casos graves pueden provocar ceguera. En casos leves, la reanimación puede tardar más de un mes y debe quedar un bulto duro que afecta gravemente la visión. 3. Las principales características del glaucoma congestivo agudo son dolor intenso en los ojos y la cabeza, acompañado de náuseas y vómitos, que a menudo enmascaran los celos y la visión borrosa. Por lo tanto, nunca debe tratarse como un dolor de cabeza o un trastorno digestivo. Por tanto, es la enfermedad número uno en urgencias oculares. Quedó ciego a los pocos días y no pudo ser salvo. El médico está en la clínica todos los días. El glaucoma congestivo agudo tiene síntomas como hinchazón y dolor intensos en los ojos y visión extremadamente borrosa. Un oftalmólogo puede diagnosticar esta enfermedad de un vistazo. Por tanto, si tienes síntomas de dolor de cabeza y dolor ocular, primero debes pensar si se trata de una enfermedad ocular, especialmente la posibilidad de glaucoma congestivo agudo. Cuarto, el glaucoma simple a menudo causa ataques menores cuando los ojos se usan en exceso o el trauma mental es menor. Durante el ataque, los ojos están ligeramente hinchados, duele la raíz de la nariz y la visión se vuelve borrosa. Después de descansar o dormir, todo vuelve a la normalidad por la mañana. Por lo tanto, a menudo se cree que las personas inevitablemente envejecerán o tendrán cierta fatiga ocular y no necesitarán tratamiento, lo que provocará numerosos ataques menores durante un largo período de tiempo. Con el tiempo, el nervio óptico se atrofia gradualmente y la visión se acerca a la ceguera, ¡haciendo imposible tratarlos! Además, debido a que los ojos del paciente suelen ser normales, la visión disminuye gradualmente y no se descubre fácilmente, por eso se dice "ciego". Recuerde, las personas que presenten los síntomas de convulsiones menores antes mencionados deben acudir a un hospital especializado para un examen de exclusión de glaucoma para prevenir futuras complicaciones. 5. Signos de embolia de la arteria central de la retina (oclusión). Esta enfermedad se caracteriza por que los pacientes a menudo experimentan ceguera transitoria frente a sus ojos y la visión se recupera en unos segundos o incluso minutos o diez minutos. Algunas personas mayores piensan erróneamente que todo estará bien una vez curada la enfermedad, por lo que no van al hospital. Cuando la arteria central de la retina se bloquee y se queden ciegos, ¡será demasiado tarde para ir al hospital! Por tanto, la enfermedad no se puede curar y acaba en ceguera. Por lo tanto, los pacientes de edad avanzada con presión arterial alta, arteriosclerosis y ceguera temporal deben acudir al hospital de inmediato y tomar medidas preventivas a tiempo para evitar la oclusión de la arteria retiniana. En sexto lugar, la causa de los tumores retrobulbares se desarrolla lentamente, a menudo se extiende hacia atrás y no invade el globo ocular durante varios años. Pero siempre hay razones por las que el nervio óptico se comprime fácilmente. Un profesor de Shenyang sufrió de papiledema durante más de cuatro años y acudió a varios hospitales importantes para recibir tratamiento médico. La razón no está clara, pero ignoró el tumor del globo ocular, que provocó que el nervio óptico se comprimiera, se atrofiara gradualmente y su visión disminuyera gradualmente. Por lo tanto, si se encuentra edema de papila y se desconoce la causa, se deben realizar exámenes de "ultrasonido B" y "TC". Estos exámenes pueden diagnosticar y localizar tumores con precisión. 7. Cuerpos extraños en el ojo Es más probable que los cuerpos extraños en el ojo se diagnostiquen erróneamente en las siguientes circunstancias: ¡Si hay 1 ~ en el taller! Limaduras de hierro de tamaño milimétrico se filtran en la parte blanca del globo ocular a través de la piel del párpado y luego ingresan al globo ocular. Al principio no hay síntomas y no es fácil detectarlo usted mismo. Como las limaduras de hierro eran pequeñas y las heridas en los párpados y los ojos blancos se cerraban rápidamente y eran difíciles de ver, pensé que no era nada.