¿Qué tal escribir un archivo de sintaxis en C usando notación aditiva?
Al pasar de un identificador a un terminador, comience con las reglas que contienen el identificador, busque en la parte izquierda de todas las reglas las reglas que contengan el identificador y luego busque en la parte derecha de estas. reglas encontradas Busque caracteres no terminales, si están incluidos, busque las reglas cuya parte izquierda contenga caracteres no terminales de todas las reglas y márquelas una vez completada la primera búsqueda, realice un bucle para encontrar las reglas con marcas. Una vez completada la primera búsqueda, realice un bucle para buscar las reglas marcadas y continúe marcando las reglas restantes de la misma manera que antes hasta que no se marquen nuevas reglas. Salga y elimine el cuerpo de la regla sin marcar.
Lo mismo se aplica en. la dirección opuesta.
No hay nada mejor que echar un vistazo al código. La siguiente es la función de compresión que escribí al escribir compresión de sintaxis
void Mylist: :.condense(char spot ,CString gettofun)
{
//condensar con spot way
addsignal(spot,1);
for(int i =1;i<7;i++)
{
for(int j=0;j { if(readsignal(j)==i) { int rightlength=findright(j).GetLength(); for( int k=0;k { if(gettofun.Find(findright(j).GetAt(k))! =-1) { addsignal(findright(j).GetAt(k),i+1); } } } } } } } } // Reglas de palabras sin signo, como s. := s* bool caiding=false; for( int j=0;j { int rightlength=findright(j).GetLength(); for( int k=0;k { if( findleft(j)! =findright(j).GetAt(k)) caiding=true; } if(caiding==false) {signal(j,0);} } for(int j1=0;j1 { if(readsignal(j1)==q) { for(int i1=0;i1 //int right=findright(i1).GetLength(); for(int i2=0;i2 { if(findleft(j1)==findright(i1). El valor de retorno es de tipo CString La función signal(int i,int j) se utiliza para encontrar la regla i firma el bit (es decir, agrega un signo) y pongo j en el bit de signo para indicar que la regla ha sido marcada addsignal(char i,int j) Encuentra la regla de la izquierda denominada i y usar la marca j. addsignalright tiene el mismo efecto Esta función tiene dos parámetros, uno es el punto del identificador Z y el otro es la cola de terminadores CString que contiene todos los terminadores conocidos Permítanme explicar aquí que wordrule es un objeto de la clase de cuerpo gramatical. Es una lista vinculada y cada nodo (nodo) es una regla: nodo de clase {. público: char palabras izquierdas; int señal; CString palabras derechas; nodo *siguiente; público: nodo(char,CString); virtual ~nodo(); }; Espero que esto ayude