InglésFrancésEspañol

Ad


icono de página de OnWorks

yaccposix - Online en la nube

Ejecute yaccposix en el proveedor de alojamiento gratuito de OnWorks sobre Ubuntu Online, Fedora Online, emulador en línea de Windows o emulador en línea de MAC OS

Este es el comando yaccposix que se puede ejecutar en el proveedor de alojamiento gratuito de OnWorks utilizando una de nuestras múltiples estaciones de trabajo en línea gratuitas, como Ubuntu Online, Fedora Online, emulador en línea de Windows o emulador en línea de MAC OS.

PROGRAMA:

NOMBRE


yacc - otro compilador más (SOSTENIBLE)

SINOPSIS


yacc [−dltv] [−b prefijo_archivo] [−pag prefijo_sim] gramática

DESCRIPCIÓN


El yacc La utilidad leerá una descripción de una gramática libre de contexto en gramática y escribe C
código fuente, conforme al estándar ISO C, a un archivo de código y, opcionalmente, encabezado
información en un archivo de encabezado, en el directorio actual. El código fuente generado deberá
no depender de ningún comportamiento indefinido, no especificado o definido por la implementación, excepto en
casos donde se copia directamente de la gramática proporcionada, o en casos que son
documentado por la implementación. El código C debe definir una función y rutinas relacionadas
y macros para un autómata que ejecuta un algoritmo de análisis que cumple los requisitos de
Algoritmos.

La forma y el significado de la gramática se describen en la sección DESCRIPCIÓN EXTENDIDA.

El código fuente C y el archivo de encabezado se producirán en una forma adecuada como entrada para C
compilador (ver c99).

CAMPUS


El yacc La utilidad deberá cumplir con el volumen de Definiciones Básicas de POSIX.1‐2008, Sección
12.2, Utilidad Sintaxis Líneas directrices, a excepción de la Directriz 9.

Se admitirán las siguientes opciones:

−b prefijo_archivo
Uso prefijo_archivo en lugar de y como prefijo para todos los nombres de archivo de salida. El código
presentar y.tab.c, el archivo de encabezado y.tab.h (creado cuando −d se especifica), y el
archivo de descripción y.salida (creado cuando −v se especifica), se cambiará a
prefijo_archivo.tab.c, prefijo_archivo.tab.hy prefijo_archivo.producción, respectivamente.

−d Escriba el archivo de encabezado; de forma predeterminada, solo se escribe el archivo de código. El #definir
declaraciones asocian los códigos de token asignados por yacc con el usuario declarado
nombres de token. Esto permite archivos de origen que no sean y.tab.c para acceder al token
códigos.

−l Produzca un archivo de código que no contenga ningún #línea constructos. Si esta opcion
no está presente, no se especifica si el archivo de código o el archivo de encabezado contiene
#línea directivas. Esto solo debe usarse después de la gramática y los
las acciones están completamente depuradas.

−pag prefijo_sim
Uso prefijo_sim en lugar de yy como prefijo para todos los nombres externos producidos por
yacc. Los nombres afectados incluirán las funciones analizar() yylex(), y
yyerror() y las variables yylval, ychary yydebug. (En el resto de
En esta sección, se hace referencia a los seis símbolos citados utilizando sus nombres predeterminados.
sólo como una conveniencia de notación.) Los nombres locales también pueden verse afectados por la −pag
opción; sin embargo, el −pag la opción no afectará #definir símbolos generados por
yacc.

−t Modificar las directivas de compilación condicional para permitir la compilación de depuración
código en el archivo de código. Las declaraciones de depuración en tiempo de ejecución siempre estarán contenidas en
el archivo de código, pero por defecto las directivas de compilación condicional impiden su
Compilacion.

−v Escriba un archivo que contenga una descripción del analizador y un informe de conflictos.
generado por ambigüedades en la gramática.

OPERANDOS


Se requiere el siguiente operando:

gramática Un nombre de ruta de un archivo que contiene instrucciones, en adelante llamado gramática, Para
que se va a crear un analizador. El formato de la gramática se describe en la
Sección DESCRIPCIÓN EXTENDIDA.

ESTÁNDAR


No utilizado.

ENTRADA ARCHIVOS


El archivo gramática será un archivo de texto formateado como se especifica en la DESCRIPCIÓN EXTENDIDA
.

MEDIO AMBIENTE VARIABLES


Las siguientes variables de entorno afectarán la ejecución de yacc:

IDIOMA Proporcione un valor predeterminado para las variables de internacionalización que no están configuradas o
nulo. (Consulte el volumen de Definiciones básicas de POSIX.1‐2008, Sección 8.2,
Internacionalización Variables por la precedencia de la internacionalización
variables utilizadas para determinar los valores de las categorías de configuración regional).

LC_TODOS Si se establece en un valor de cadena no vacío, anule los valores de todos los demás
Variables de internacionalización.

LC_CTYPE Determinar la configuración regional para la interpretación de secuencias de bytes de datos de texto.
como caracteres (por ejemplo, de un solo byte en lugar de caracteres de varios bytes en
argumentos y archivos de entrada).

LC_MENSAJES
Determine la configuración regional que se debe utilizar para afectar el formato y el contenido de
mensajes de diagnóstico escritos en error estándar.

NLSPATH Determinar la ubicación de los catálogos de mensajes para el procesamiento de LC_MENSAJES.

El IDIOMA y LC_ * Las variables afectan la ejecución de la yacc utilidad como se indica. El principal()
función definida en Yacc Biblioteca llamará:

setlocale (LC_ALL, "")

y así el programa generado por yacc también se verá afectado por el contenido de estos
variables en tiempo de ejecución.

ASINCRÓNICO EVENTOS


Por defecto.

SALIDA ESTÁNDAR


No utilizado.

ESTDERR


Si se detectan cambios / reducir o reducir / reducir conflictos en gramática, yacc Deberá escribir un
informe de esos conflictos al error estándar en un formato no especificado.

El error estándar también se utilizará para los mensajes de diagnóstico.

SALIDA ARCHIVOS


El archivo de código, el archivo de encabezado y el archivo de descripción serán archivos de texto. Todos son
descrito en las siguientes secciones.

Código Archive
Este archivo debe contener el código fuente C para el analizar() función. Contendrá
código para las diversas acciones semánticas con sustitución de macros realizada en ellas como
descrito en la sección DESCRIPCIÓN AMPLIADA. También deberá contener una copia del #definir
declaraciones en el archivo de encabezado. Si un %Unión se utiliza la declaración, la declaración para
YYSTYPE también se incluirá en este archivo.

Encabezamiento Archive
El archivo de encabezado debe contener #definir declaraciones que asocian los números de token con el
nombres de token. Esto permite que los archivos de origen distintos del archivo de código accedan a los códigos de token.
Si un %Unión se utiliza la declaración, la declaración para YYSTYPE y una externo YYSTYPE yylval
La declaración también se incluirá en este expediente.

Descripción Archive
El archivo de descripción será un archivo de texto que contenga una descripción de la máquina de estado.
correspondiente al analizador, utilizando un formato no especificado. Límites para tablas internas (ver
Límites) también se informará, de una manera definida por la implementación. (Algunas implementaciones
pueden utilizar técnicas de asignación dinámica y no tener valores límite específicos para informar).

EXTENDIDO DESCRIPCIÓN


El yacc El comando acepta un idioma que se usa para definir una gramática para un idioma de destino
para ser analizado por las tablas y el código generado por yacc. El idioma aceptado por yacc como herramienta de edición del
La gramática para el idioma de destino se describe a continuación utilizando la yacc idioma de entrada en sí.

La entrada gramática incluye reglas que describen la estructura de entrada del idioma de destino y
código que se invocará cuando se reconozcan estas reglas para proporcionar la semántica asociada
acción. El código que se ejecutará aparecerá como cuerpos de texto que están destinados a ser C-
Código de lenguaje. Estos cuerpos de texto no deben contener trígrafos en lenguaje C. El lenguaje C
Se presume que las inclusiones forman una función correcta cuando son procesadas por yacc en su salida
archivos. El código así incluido se ejecutará durante el reconocimiento de la
lengua de llegada.

Dada una gramática, la yacc La utilidad genera los archivos descritos en los ARCHIVOS DE SALIDA
sección. El archivo de código se puede compilar y vincular usando c99. Si la declaración y
Las secciones de programas del archivo de gramática no incluían definiciones de principal() yylex(), y
yyerror(), la salida compilada requiere la vinculación con versiones suministradas externamente de esos
funciones. Versiones predeterminadas de principal() y yyerror() se suministran en el yacc biblioteca y
se puede vincular mediante el −l y operando a c99. yacc las interfaces de la biblioteca no necesitan
admite interfaces con otras que no sean las predeterminadas yy prefijo de símbolo. La aplicación proporciona
la función del analizador léxico, yylex(); el lex La utilidad está diseñada específicamente para
generar esa rutina.

Entrada Idioma
La aplicación debe garantizar que cada archivo de especificación consta de tres secciones en
orden: declaraciones, gramática reglasy programas, separados por doble
caracteres ("%%"). Las secciones de declaraciones y programas pueden estar vacías. Si este último es
vacío, el anterior "%%" Se puede omitir la marca que lo separa de la sección de reglas.

La entrada es texto de forma libre siguiendo la estructura de la gramática definida a continuación.

Léxico Estructura of las Gramática
El , , y se ignorará el carácter, excepto que el
La aplicación se asegurará de que no aparezcan en nombres o reservados de varios caracteres.
símbolos. Los comentarios se incluirán en "/ * ... * / ", y puede aparecer donde sea que haya un nombre
válido.

Los nombres son de longitud arbitraria, compuestos de letras, puntos ('.'), guiones bajos ('_'), o
dígitos no iniciales. Las letras mayúsculas y minúsculas son distintas. Aplicaciones conformes
no utilizará nombres que comiencen en yy or YY ya que el yacc parser usa tales nombres. Muchos de
los nombres aparecen en la salida final de yacc, y por lo tanto deben ser elegidos para cumplir
con cualquier regla adicional creada por el compilador de C que se utilizará. En particular, aparecen
in #definir Declaraciones.

Un literal constará de un solo carácter entre comillas simples. Todo
las secuencias de escape admitidas para las constantes de caracteres por la norma ISO C deben ser
CON EL APOYO DE yacc.

La relación con el analizador léxico se analiza en detalle a continuación.

La aplicación garantizará que el carácter NUL no se utilice en reglas gramaticales o
literales.

Declaraciones Sección
La sección de declaraciones se utiliza para definir los símbolos utilizados para definir el idioma de destino.
y su relación entre ellos. En particular, gran parte de la información adicional
necesario para resolver ambigüedades en la gramática libre de contexto para el idioma de destino es
proporcionado aquí.

Generalmente yacc asigna la relación entre los nombres simbólicos que genera y su
valor numérico subyacente. La sección de declaraciones permite controlar la
asignación de estos valores.

También es posible mantener la información semántica asociada con los tokens actualmente en
la pila de análisis en un lenguaje C definido por el usuario unión, si los miembros del sindicato son
asociado con los diversos nombres en la gramática. La sección de declaraciones prevé
esto también.

El primer grupo de declaradores a continuación toma una lista de nombres como argumentos. Esa lista puede
opcionalmente ir precedido por el nombre de un miembro del sindicato C (llamado etiqueta a continuación) apareciendo
dentro de '<' y '>'. (Como excepción a las convenciones tipográficas del resto de este
volumen de POSIX.1‐2008, en este casoetiqueta> no representa una metavariable, pero el
caracteres de corchetes angulares literal que rodean un símbolo.) El uso de etiqueta especifica que el
Los tokens nombrados en esta línea serán del mismo tipo C que el miembro del sindicato al que hace referencia
etiqueta. Esto es discutido con más detalle abajo.

Para las listas que se utilizan para definir tokens, la primera aparición de un token determinado puede ir seguida de
un entero positivo (como una cadena de dígitos decimales). Si se hace esto, el valor subyacente
que se le asigne a efectos léxicos se considerará dicho número.

Lo siguiente declara nombre ser un token:

%simbólico [<etiqueta>] nombre [número] [nombre [número]]...

If etiqueta está presente, el tipo C para todos los tokens en esta línea se declarará como el tipo
referenciado por etiqueta. Si es un entero positivo, número, sigue un nombre , ese valor será
asignado al token.

Lo siguiente declara nombre para ser un token, y le asigna precedencia:

%izquierda [<etiqueta>] nombre [número] [nombre [número]]...
%derecho [<etiqueta>] nombre [número] [nombre [número]]...

En esta sección pueden aparecer una o más líneas, cada una de las cuales comienza con uno de estos símbolos.
Todos los tokens de la misma línea tienen el mismo nivel de precedencia y asociatividad; las líneas
están en orden de precedencia creciente o fuerza vinculante. %izquierda denota que el
los operadores en esa línea son asociativos a la izquierda, y %derecho de manera similar denota derecho
operadores asociativos. Si etiqueta está presente, declarará un tipo C para nombre s como se describe
para %simbólico.

Lo siguiente declara nombre para ser un token, e indica que esto no se puede utilizar
asociativamente:

% nonassoc [<etiqueta>] nombre [número] [nombre [número]]...

Si el analizador encuentra un uso asociativo de este token, informa de un error. Si etiqueta is
presente, declarará un tipo C para nombre s como se describe para %simbólico.

Lo siguiente declara que miembro del sindicato nombre s no son terminales, por lo que se requiere
tener un etiqueta campo al principio:

%tipo <etiqueta> nombre ...

Debido a que trata solo con no terminales, asignar un número de token o usar un literal es
también prohibido. Si esta construcción está presente, yacc realizará la verificación de tipo; si esto
construcción no está presente, la pila de análisis debe contener solo el int tipo.

Cada nombre usado en gramática no definido por un %simbólico, %izquierda, %derechoo % nonassoc
Se supone que la declaración representa un símbolo no terminal. El yacc la utilidad debe informar
un error para cualquier símbolo no terminal que no aparece en el lado izquierdo de al menos un
Regla gramátical.

Una vez que se especifica el tipo, la precedencia o el número de token de un nombre, no se
cambió. Si la primera declaración de un token no asigna un número de token, yacc deberá
Asignar un número de token. Una vez realizada esta asignación, el número de token no se cambiará
por cesión explícita.

Los siguientes declaradores no siguen el patrón anterior.

Lo siguiente declara el no terminal nombre ser el comienzo símbolo, que representa el
estructura más grande y general descrita por las reglas gramaticales:

%comienzo nombre

De forma predeterminada, es el lado izquierdo de la primera regla gramatical; este valor predeterminado puede ser
anulado con esta declaración.

Lo siguiente declara el yacc La pila de valores debe ser una unión de los distintos tipos de valores.
deseado.

%Unión { cuerpo of unión (in C)}

El cuerpo de la unión no deberá contener fichas de preprocesamiento de llaves rizadas desequilibradas.

Por defecto, los valores devueltos por las acciones (ver más abajo) y el analizador léxico serán
De tipo int. yacc La utilidad realiza un seguimiento de los tipos e inserta los correspondientes
nombres de miembros de la unión con el fin de realizar una comprobación de tipo estricta del analizador resultante.

Alternativamente, dado que al menos unaetiqueta> se usa la construcción, la unión se puede declarar
en un archivo de encabezado (que se incluirá en la sección de declaraciones mediante un #incluir
construir dentro %{ y %}) y a typedef utilizado para definir el símbolo YYSTYPE para representar
esta unión. El efecto de %Unión es proporcionar la declaración de YYSTYPE directamente desde
las yacc entrada.

Las declaraciones y definiciones en lenguaje C pueden aparecer en la sección de declaraciones, adjunta
por las siguientes marcas:

%{ ... %}

Estas declaraciones se copiarán en el archivo de código y tendrán un alcance global dentro de él, por lo que
que se pueden utilizar en las secciones de reglas y programas. Las declaraciones no deben contener
"%}" fuera de un comentario, literal de cadena o constante de varios caracteres.

La aplicación garantizará que la sección de declaraciones finalice con el token. %%.

Gramática Reglas in yacc
La sección de reglas define la gramática libre de contexto que debe aceptar la función yacc
genera y asocia con esas reglas acciones en lenguaje C y precedencia adicional
información. La gramática se describe a continuación y sigue una definición formal.

La sección de reglas se compone de una o más reglas gramaticales. Una regla gramatical tiene la forma:

A : CUERPO ;

El símbolo A representa un nombre no terminal, y CUERPO representa una secuencia de cero o
más, nombre s, literals y semántico DE ACTUAR!s que luego pueden ir seguidos de opcionales
precedencia gobernars. Sólo los nombres y literales participan en la formación de la
gramática; las acciones semánticas y las reglas de precedencia se utilizan de otras formas. El y
el son yacc puntuación. Si hay varias reglas gramaticales sucesivas con
el mismo lado izquierdo, el ('|') se puede utilizar para evitar reescribir el
lado izquierdo; en este caso el aparece solo después de la última regla. El cuerpo
parte puede estar vacía (o vacía de nombres y literales) para indicar que el no terminal
el símbolo coincide con la cadena vacía.

El yacc La utilidad asigna un número único a cada regla. Reglas usando la barra vertical
la notación son reglas distintas. El número asignado a la regla aparece en la descripción.
archivo.

Los elementos que componen un CUERPO son:

nombre , literal
Éstos forman las reglas de la gramática: nombre es un ficha o un no terminal;
literal representa a sí mismo (menos las comillas requeridas léxicamente).

semántico DE ACTUAR!
Con cada regla gramatical, el usuario puede asociar acciones a realizar cada vez
la regla se reconoce en el proceso de entrada. (Tenga en cuenta que la palabra `` acción '' puede
también se refieren a las acciones del analizador: cambiar, reducir, etc.)

Estas acciones pueden devolver valores y pueden obtener los valores devueltos por anteriores
comportamiento. Estos valores se guardan en objetos de tipo YYSTYPE (ver %Unión). La
El valor de resultado de la acción se mantendrá en la pila de análisis con el lado izquierdo.
lado de la regla, para ser accedido por otras reducciones como parte de su mano derecha
lado. Usando eletiqueta> información proporcionada en la sección de declaraciones, el
código generado por yacc se puede comprobar estrictamente el tipo y contener arbitrario
información. Además, el analizador léxico puede proporcionar los mismos tipos de
valores para tokens, si lo desea.

Una acción es una declaración C arbitraria y, como tal, puede hacer entrada o salida, llamar
subprogramas y alterar variables externas. Una acción es una o más declaraciones C
encerrado en llaves '{' y '}'. Las declaraciones no deben contener
tokens de preprocesamiento de llaves rizadas desequilibradas.

Se pueden usar ciertas pseudovariables en la acción. Estas son macros para acceder
a estructuras de datos conocidas internamente yacc.

$$ El valor de la acción se puede establecer asignándolo a $$. Si escribe
La verificación está habilitada y el tipo de valor a asignar no puede ser
determinado, se puede generar un mensaje de diagnóstico.

$número Esto se refiere al valor devuelto por el componente especificado por el
ficha número en el lado derecho de una regla, leyendo de izquierda a derecha;
número puede ser cero o negativo. Si número es cero o negativo, es
se refiere a los datos asociados con el nombre en la pila del analizador
que precede al símbolo más a la izquierda de la regla actual. (Es decir, "$ 0"
se refiere al nombre inmediatamente anterior al nombre más a la izquierda en el
la regla actual que se encuentra en la pila del analizador y "$ −1" se refiere a
símbolo para su izquierda.) Si número se refiere a un elemento más allá de la corriente
punto en la regla, o más allá del final de la pila, el resultado es
indefinido. Si la verificación de tipo está habilitada y el tipo de valor que se
asignado no se puede determinar, se puede generar un mensaje de diagnóstico.

$<etiqueta>número
Estos corresponden exactamente a los símbolos correspondientes sin el etiqueta
inclusión, pero permite una verificación de tipo estricta (y evita
conversiones de tipo). El efecto es que la macro se expande para usar etiqueta
para seleccionar un elemento de la unión YYSTYPE (usando nombre de datos.etiqueta).
Esto es particularmente útil si número no es positivo.

$<etiqueta> $ Esto impone a la referencia el tipo de miembro del sindicato al que se hace referencia
by etiqueta. Esta construcción es aplicable cuando una referencia a una izquierda
El valor de contexto ocurre en la gramática y proporciona yacc con un medio
para seleccionar un tipo.

Las acciones pueden ocurrir en cualquier parte de una regla (no solo al final); una acción puede acceder
valores devueltos por acciones a su izquierda y, a su vez, el valor que devuelve puede ser
accedido por acciones a su derecha. Una acción que aparece en medio de una regla.
será equivalente a reemplazar la acción con un nuevo símbolo no terminal y
agregando una regla vacía con ese símbolo no terminal en el lado izquierdo. El
La acción semántica asociada con la nueva regla será equivalente a la original.
acción. El uso de acciones dentro de las reglas puede introducir conflictos que no
de lo contrario existir.

Por defecto, el valor de una regla será el valor del primer elemento en ella.
Si el primer elemento no tiene un tipo (particularmente en el caso de un
literal) y la verificación de tipos se activa mediante %tipo, resultará un mensaje de error.

precedencia
La palabra clave % prec se puede utilizar para cambiar el nivel de precedencia asociado con un
regla gramatical particular. Ejemplos de esto son los casos en los que un unario y un binario
El operador tiene la misma representación simbólica, pero debe recibir diferentes
precedentes, o donde el manejo de una construcción ambigua if-else es
necesario. El símbolo reservado % prec puede aparecer inmediatamente después del cuerpo de
la regla gramatical y puede ir seguida de un nombre de token o un literal. Será
hacer que la precedencia de la regla gramatical se convierta en la del siguiente token
nombre o literal. La acción para la regla en su conjunto puede seguir % prec.

Si sigue una sección del programa, la aplicación se asegurará de que las reglas gramaticales sean
terminado por %%.

Programas Sección
El programas La sección puede incluir la definición del analizador léxico. yylex(), y cualquier
otras funciones; por ejemplo, los utilizados en las acciones especificadas en las reglas gramaticales. Eso
no se especifica si la sección de programas precede o sigue a las acciones semánticas en
el archivo de salida; por lo tanto, si la aplicación contiene alguna definición de macro y
declaraciones destinadas a aplicar al código en las acciones semánticas, las colocará
dentro de "% { ... %} " en la sección de declaraciones.

Entrada Gramática
La siguiente entrada para yacc produce un analizador para la entrada a yacc. Esta sintaxis formal
tiene prioridad sobre la descripción de sintaxis de texto anterior.

La estructura léxica se define con menos precisión; Léxico Estructura of las Gramática define
la mayoría de los términos. La correspondencia entre los términos anteriores y los tokens a continuación es como
de la siguiente manera.

IDENTIFICADOR Esto corresponde al concepto de nombre , dado anteriormente. También incluye
literales como se definieron previamente.

C_IDENTIFICADOR
Este es un nombre y, además, se sabe que va seguido de un . A
literal no puede ceder este token.

NÚMERO Una cadena de dígitos (un entero decimal no negativo).

TIPO, IZQUIERDA, MARCA, LCURL, rcurl
Estos corresponden directamente a %tipo, %izquierda, %%, %{y %}.

{ ... } Esto indica código fuente en lenguaje C, con la posible inclusión de PS
macros como se discutió anteriormente.

/* Gramática para las Las opciones de entrada a yacc. */
/* Basic entradas. */
/* El siguiendo en reconocido by las léxico analizador. */

% IDENTIFICADOR de token / * Incluye identificadores y literales * /
% token C_IDENTIFIER / * identificador (pero no literal)
seguido de un:. * /
% token NUMBER / * [0-9] [0-9] * * /

/ * Palabras reservadas:% type => TYPE% left => LEFT, y así sucesivamente * /

% token IZQUIERDA DERECHA NONASSOC TOKEN PREC TIPO INICIO UNIÓN

% token MARK / * La marca %%. * /
% token LCURL / * La marca% {. * /
% token RCURL / * La marca%}. * /

/ * Los literales de caracteres de 8 bits se representan por sí mismos; * /
/ * Los tokens deben definirse para caracteres de varios bytes. * /

% especificación de inicio

%%

especificación: defs MARK reglas cola
;
cola: MARCA
{
/ * En esta acción, configure el resto del archivo. * /
}
| /* Vacío; la segunda MARCA es opcional. * /
;
defs: / * Vacío. * /
| def def
;
def: IDENTIFICADOR DE INICIO
| UNIÓN
{
/ * Copiar la definición de unión a la salida. * /
}
| LCURL
{
/ * Copie el código C en el archivo de salida. * /
}
rcurl
| rword etiqueta nlist
;
rword: TOKEN
| IZQUIERDA
| DERECHO
| NONASOC
| ESCRIBE
;
etiqueta: / * Vacío: ID de etiqueta de unión opcional. * /
| '<' IDENTIFICADOR '>'
;
nlist: nmno
| lista nmno
;
nmno: IDENTIFICADOR / * Nota: literal no válido con% tipo. * /
| NÚMERO DE IDENTIFICADOR / * Nota: no válido con% tipo. * /
;

/ * Sección de reglas * /

reglas: C_IDENTIFIER rbody prec
| las reglas gobiernan
;
regla: C_IDENTIFIER rbody prec
| '|' rbody prec
;
rbody: / ​​* vacío * /
| IDENTIFICADOR de cuerpo
| acto corporal
;
actuar : '{'
{
/ * Copiar acción, traducir $$, etc. * /
}
'}'
;
prec: / * Vacío * /
| IDENTIFICADOR PREC
| Ley PREC IDENTIFICADOR
| prec ';'
;

Conflictos
El analizador generado para una gramática de entrada puede contener estados en los que se producen conflictos. El
los conflictos ocurren porque la gramática no es LALR(1). Una gramática ambigua siempre contiene
al menos uno LALR(1) conflicto. El yacc La utilidad resolverá todos los conflictos, utilizando
reglas predeterminadas o reglas de precedencia especificadas por el usuario.

Los conflictos pueden cambiar / reducir conflictos o reducir / reducir conflictos. Un cambio / reducir
El conflicto es donde, para un estado dado y un símbolo de anticipación, tanto una acción de cambio como una
Reducir la acción es posible. Un conflicto de reducir / reducir es donde, para un estado dado y
símbolo de anticipación, es posible realizar reducciones mediante dos reglas diferentes.

Las siguientes reglas describen cómo especificar qué acciones tomar cuando ocurre un conflicto. No
Todos los conflictos de cambio / reducción se pueden resolver con éxito de esta manera porque el conflicto puede
debido a algo más que ambigüedad, por lo que el uso imprudente de estas instalaciones puede causar
el lenguaje aceptado por el analizador sintáctico es muy diferente al que se pretendía. El
El archivo de descripción debe contener información suficiente para comprender la causa de la
conflicto. Donde la ambigüedad es la razón por la que las reglas predeterminadas o explícitas deben ser
adecuado para producir un analizador sintáctico que funcione.

Las precedencias y asociatividades declaradas (ver Declaraciones Sección) se utilizan para
resuelva los conflictos de análisis de la siguiente manera:

1. Se asocia una precedencia y asociatividad con cada regla gramatical; es el
precedencia y asociatividad del último token o literal en el cuerpo de la regla. Si
las % prec se utiliza la palabra clave, anula este valor predeterminado. Es posible que algunas reglas gramaticales no
tienen precedencia y asociatividad.

2. Si hay un conflicto de cambio / reducción, y tanto la regla gramatical como el símbolo de entrada
tienen precedencia y asociatividad asociada con ellos, entonces el conflicto se resuelve
a favor de la acción (cambiar o reducir) asociada con la precedencia más alta. Si el
las precedencias son las mismas, entonces se usa la asociatividad; asociativo de izquierda implica
reducir, asociativo a la derecha implica desplazamiento, y no asociativo implica un error en el
cadena que se analiza.

3. Cuando hay un conflicto de cambio / reducción que no puede resolverse con la regla 2, el cambio es
hecho. Los conflictos resueltos de esta manera se cuentan en la salida de diagnóstico descrita en
Error Manejo.

4. Cuando hay un conflicto de reducir / reducir, se realiza una reducción mediante la regla gramatical que
ocurre antes en la secuencia de entrada. Los conflictos resueltos de esta manera se contabilizan en el
salida de diagnóstico descrita en Error Manejo.

Los conflictos resueltos por precedencia o asociatividad no se contabilizarán en el turno / reducir
y reducir / reducir los conflictos reportados por yacc en el error estándar o en el
archivo de descripción.

Error Manejo
El token error se reservará para el tratamiento de errores. El nombre error puede ser utilizado en
reglas gramaticales. Indica los lugares donde el analizador puede recuperarse de un error de sintaxis. El
valor predeterminado de error será 256. Su valor se puede cambiar utilizando un %simbólico declaración.
El analizador léxico no debe devolver el valor de error.

El analizador debe detectar un error de sintaxis cuando se encuentra en un estado en el que la acción asociada
con el símbolo de anticipación es error. Una acción semántica puede hacer que el analizador inicie
manejo de errores ejecutando la macro YYERROR. Cuando se ejecuta YYERROR, la semántica
La acción devuelve el control al analizador. YYERROR no se puede utilizar fuera de la semántica
acciones.

Cuando el analizador detecta un error de sintaxis, normalmente llama yyerror() con el personaje
cadena "sintaxis error" como su argumento. La llamada no se realizará si el analizador todavía está
recuperarse de un error anterior cuando se detecta el error. Se considera que el analizador
recuperarse de un error anterior hasta que el analizador se haya desplazado en al menos tres
símbolos de entrada normales desde que se detectó el último error o se ejecutó una acción semántica
la macro yerrok. El analizador no llamará yyerror() cuando se ejecuta YYERROR.

La función macro YYRECOVERING devolverá 1 si se ha detectado un error de sintaxis y el
parser aún no se ha recuperado por completo. De lo contrario, se devolverá cero.

Cuando el analizador detecta un error de sintaxis, el analizador debe comprobar si una sintaxis anterior
se ha detectado un error. Si se detectó un error anterior y si no hay símbolos de entrada normales
han cambiado desde que se detectó el error anterior, el analizador comprueba si el
El símbolo de anticipación es un marcador final (consulte Interfaz a las Léxico Analizador). Si lo es, el
parser debe regresar con un valor distinto de cero. De lo contrario, el símbolo de anticipación será
descartados y se reanudará el análisis normal.

Cuando se ejecuta YYERROR o cuando el analizador detecta un error de sintaxis y ningún error anterior
se ha detectado, o al menos un símbolo de entrada normal se ha desplazado desde el anterior
se detectó un error, el analizador deberá retroceder un estado a la vez hasta que la pila de análisis sea
vacío o el estado actual permite un cambio sobre error. Si el analizador vacía el análisis
stack, volverá con un valor distinto de cero. De lo contrario, cambiará error y
luego reanude el análisis normal. Si el analizador lee un símbolo de anticipación antes de que se produjera el error
detectado, ese símbolo seguirá siendo el símbolo de anticipación cuando se reanude el análisis.

La macro yerrok en una acción semántica hará que el analizador actúe como si hubiera
recuperado de cualquier error anterior. La macro yyclearin hará que el analizador descarte
el token de anticipación actual. Si aún no se ha leído el token de anticipación actual,
yyclearin no tendrá ningún efecto.

La macro YYACCEPT hará que el analizador vuelva con el valor cero. La macro YYABORT
hará que el analizador regrese con un valor distinto de cero.

Interfaz a las Léxico Analizador
El yylexLa función () es una función con valores enteros que devuelve un ficha número
que representa el tipo de token leído. Si hay un valor asociado con el token
devuelto por yylex() (ver la discusión de etiqueta anterior), se asignará a la
variable externa yylval.

Si el analizador y yylex() no están de acuerdo con estos números de token, comunicación confiable
entre ellos no puede ocurrir. Para literales (carácter de un solo byte), el token es simplemente el
valor numérico del carácter en el juego de caracteres actual. Los números de otras fichas
puede ser elegido por yacc, o elegido por el usuario. En cualquier caso, el #definir construir
de C se utiliza para permitir yylex() para devolver estos números simbólicamente. El #definir declaraciones
se colocan en el archivo de código y en el archivo de encabezado si se solicita ese archivo. El conjunto de
caracteres permitidos por yacc en un identificador es más grande que el permitido por C. Token
Los nombres que contengan tales caracteres no se incluirán en el #definir declaraciones.

Si los números de token son elegidos por yacc, los tokens que no sean literales se asignarán
números mayores que 256, aunque no se implica ningún orden. Un token se puede asignar explícitamente
un número siguiendo su primera aparición en la sección de declaraciones con un número.
Los nombres y literales que no se definen de esta manera conservan su definición predeterminada. Todos los números de token
Asignado por yacc será único y distinto de los números de token utilizados para literales y
tokens asignados por el usuario. Si los números de token duplicados causan conflictos en la generación del analizador,
yacc informará un error; de lo contrario, no se especifica si la asignación del token es
aceptado o se informa de un error.

El final de la entrada está marcado por un token especial llamado marcador final, que tiene una ficha
número que es cero o negativo. (Estos valores no son válidos para cualquier otro token).
Los analizadores léxicos devolverán cero o negativo como número simbólico al llegar al final de
su entrada. Si los tokens hasta, pero excluyendo, el marcador final forman una estructura que
coincide con el símbolo de inicio, el analizador debe aceptar la entrada. Si el marcador final se ve en
cualquier otro contexto, se considerará un error.

Completando las Programa
Además de nuestras localidaded en analizar() y yylex(), Las funciones yyerror() y principal() son requeridos para
haz un programa completo. La aplicación puede suministrar principal() y yyerror(), O aquellos
las rutinas se pueden obtener de la yacc biblioteca.

Yacc Biblioteca
Las siguientes funciones aparecerán solo en el yacc biblioteca accesible a través del −l y
operando a c99; por lo tanto, pueden redefinirse mediante una aplicación conforme:

int principal(vacío)
Esta función llamará analizar() y salir con un valor no especificado. Otras acciones
dentro de esta función no están especificados.

int yyerror(const tanque *s)
Esta función escribirá el argumento terminado en NUL en error estándar, seguido de
a .

El orden del −l y y −l l operandos dados a c99 es significante; la aplicación deberá
o proporcionar su propio principal() funcionar o asegurarse de que −l y precede −l l.

Depuración las Analizador
El analizador generado por yacc debe tener facilidades de diagnóstico que pueden ser opcionalmente
habilitado en tiempo de compilación o en tiempo de ejecución (si está habilitado en tiempo de compilación). El
La compilación del código de depuración en tiempo de ejecución está bajo el control de YYDEBUG, un preprocesador
símbolo. Si YYDEBUG tiene un valor distinto de cero, se incluirá el código de depuración. Si es
el valor es cero, el código no se incluirá.

En analizadores donde se ha incluido el código de depuración, el externo int yydebug puede ser
se utiliza para activar la depuración (con un valor distinto de cero) y desactivar (valor cero) en tiempo de ejecución. El
valor inicial de yydebug será cero.

Cuándo −t se especifica, el archivo de código se construirá de tal manera que, si YYDEBUG no está ya
definido en el momento de la compilación (utilizando el c99 −D Opción YYDEBUG, por ejemplo), YYDEBUG deberá
establecerse explícitamente en 1. Cuando −t no se especifica, el archivo de código se construirá de manera que,
si YYDEBUG aún no está definido, se establecerá explícitamente en cero.

El formato de la salida de depuración no está especificado pero incluye al menos suficiente información
para determinar las acciones de cambio y reducción, y los símbolos de entrada. También proporciona
información sobre la recuperación de errores.

Algoritmos
El analizador construido por yacc implementa un LALR(1) algoritmo de análisis como se documenta en
la literatura. No se especifica si el analizador está controlado por tablas o codificado directamente.

Un analizador generado por yacc nunca solicitará un símbolo de entrada de yylex() mientras en un
indicar dónde las únicas acciones distintas de la acción de error son reducciones mediante una sola regla.

La literatura sobre la teoría del análisis sintáctico define estos conceptos.

Límites
El yacc La utilidad puede tener varias tablas internas. Los máximos mínimos para estas tablas
se muestran en la siguiente tabla. El significado exacto de estos valores es implementación-
definido. La implementación definirá la relación entre estos valores y entre
ellos y cualquier mensaje de error que la implementación pueda generar si se queda sin
Espacio para cualquier estructura interna. Una implementación puede combinar grupos de estos recursos
en un solo grupo siempre que el total disponible para el usuario no sea inferior a la suma
de los tamaños especificados en esta sección.

Mesa: Interno Límites in yacc

┌───────────┬─────────┬─────────────────────────── ─────┐
│ │ Longitud Mínima │ │
<div style="margin-top:15px">Límite</div>MáximoDescripción
├───────────┼─────────┼─────────────────────────── ─────┤
│ {NTERMS} │ 126 │ Número de tokens. │
│ {NNONTERM} │ 200 │ Número de no terminales. │
│ {NPROD} │ 300 │ Número de reglas. │
│ {NSTATES} │ 600 │ Número de estados. │
│ {MEMSIZE} │ 5200 │ Longitud de las reglas. El total │
│ │ │ longitud, en nombres (tokens y │
│ │ │ no terminales), de todos los │
│ │ │ reglas de la gramática. El │
│ │ │ el lado izquierdo se cuenta para │
│ │ │ cada regla, incluso si no lo es │
│ │ │ repetido explícitamente, como │
│ │ │ especificado en Gramática Reglas in
│ │ │ yacc. │
│ {ACTSIZE} │ 4000 │ Número de acciones. `` Acciones '' │
│ │ │ aquí (y en la descripción │
│ │ │ archivo) consulte las acciones del analizador │
│ │ │ (cambiar, reducir, etc.) no │
│ │ │ a acciones semánticas definidas en │
│ │ │ Gramática Reglas in yacc. │
└───────────┴─────────┴─────────────────────────── ─────┘

SALIR ESTADO


Se devolverán los siguientes valores de salida:

0 Finalización satisfactoria.

> 0 Ocurrió un error.

CONSECUENCIAS OF ERRORES


Si se encuentran errores, la ejecución se interrumpe y yacc salidas con un estado distinto de cero.
Se pueden generar archivos de código parcial y archivos de encabezado. La información resumida en el
archivo de descripción siempre se producirá si el −v la bandera está presente.

El siguiendo (secciones) en informativo.

SOLICITUD USO


Las implementaciones históricas experimentan conflictos de nombres en los nombres yacc.tmp, yacc.actos,
yacc.depuración, y.tab.c, y.tab.hy y.salida si más de una copia de yacc está corriendo en un
directorio único a la vez. El −b Se agregó la opción para superar este problema. El
problema relacionado de permitir múltiples yacc analizadores que se colocarán en el mismo archivo fue
abordado agregando un −pag opción para anular el código previamente codificado yy prefijo de variable.

La descripción del −pag La opción especifica el conjunto mínimo de nombres de funciones y variables.
que causan conflicto cuando varios analizadores están vinculados entre sí. YYSTYPE no necesita ser
cambió. En cambio, el programador puede usar −b para dar los archivos de encabezado para diferentes analizadores
diferentes nombres, y luego el archivo con el yylex() para un analizador determinado puede incluir el
encabezado para ese analizador. Nombres como yyclaro no es necesario cambiarlos porque
se utilizan solo en las acciones; no tienen vinculación. Es posible que un
La implementación tiene otros nombres, ya sean internos para implementar cosas como
yyclaroo proporcionar funciones no estándar que desee cambiar con −pag.

Los operadores unarios que son el mismo token que un operador binario en general necesitan su
precedencia ajustada. Esto es manejado por el % prec símbolo de aviso asociado con el
regla gramatical particular que define ese operador unario. (Ver Gramática Reglas in yacc.)
No se requiere que las aplicaciones utilicen este operador para operadores unarios, pero las gramáticas
que no lo requieren son raros.

EJEMPLOS


El acceso a la yacc biblioteca se obtiene con operandos de búsqueda de biblioteca para c99. Usar el
yacc bibliotecas principal():

c99 y.tab.c −l y

Ambos lex biblioteca y la yacc la biblioteca contiene principal(). Para acceder al yacc principal():

c99 y.tab.c lex.yy.c −l y −l l

Esto asegura que el yacc la biblioteca se busca primero, de modo que su principal() se utiliza.

El historico yacc las bibliotecas contienen dos funciones simples que normalmente se codifican
por el programador de la aplicación. Estas funciones son similares al siguiente código:

#incluir
int principal (vacío)
{
externo int yyparse ();

setlocale (LC_ALL, "");

/ * Si el siguiente analizador es uno creado por lex, el
la aplicación debe asegurarse de que LC_CTYPE
y LC_COLLATE se establecen en la configuración regional POSIX. * /
(vacío) yyparse ();
retorno (0);
}

#incluye

int yyerror (const char * msg)
{
(vacío) fprintf (stderr, "% s \ n", msg);
retorno (0);
}

RAZÓN FUNDAMENTAL


Las referencias en Referenciado Documentos puede ser útil para construir el analizador
generador. El artículo de DeRemer y Pennello al que se hace referencia (junto con las obras
referencias) describe una técnica para generar analizadores que se ajustan a este volumen de
POSIX.1‐2008. Se sigue trabajando en esta área, por lo que los implementadores deben consultar
literatura actual antes de realizar nuevas implementaciones. El artículo original de Knuth es el
base teórica para este tipo de analizador, pero las tablas que genera son imprácticamente
large para gramáticas razonables y no debe utilizarse. La redacción `` equivalente a '' es
intencional para asegurar que las mejores tablas que son LALR(1) se puede generar.

Ha habido confusión entre la clase de gramáticas, los algoritmos necesarios para generar
analizadores sintácticos y los algoritmos necesarios para analizar los idiomas. Todos están razonablemente
ortogonal. En particular, un generador de analizador que acepta la gama completa de LR(1)
Las gramáticas no necesitan generar una tabla más compleja que una que acepta SLR(1) (un
clase relativamente débil de gramáticas LR) para una gramática que resulta ser SLR(1). Tal
la implementación tampoco necesita reconocer el caso; la compresión de la tabla puede producir el SLR(1)
tabla (o incluso una más pequeña que esa) sin reconocer que la gramática es SLR(1). los
velocidad de un LR(1) el analizador para cualquier clase depende más de la representación de la tabla y
compresión (o la generación de código si se genera un analizador directo) que en la clase
de gramática que maneja el generador de tablas.

La velocidad del generador de analizador sintáctico depende de alguna manera de la clase de gramática que
manejas. Sin embargo, los algoritmos del artículo original de Knuth para construir analizadores LR fueron
juzgado por su autor como impracticablemente lento en ese momento. Aunque LR completo es más
complejo que LALR(1), a medida que mejoran las velocidades y los algoritmos de las computadoras, la diferencia (en términos
de tiempo aceptable de ejecución del reloj de pared) se está volviendo menos significativo.

Se advierte a los autores potenciales que el artículo de DeRemer y Pennello al que se hace referencia
citado anteriormente identifica un error (una simplificación excesiva del cálculo de LALR(1)
conjuntos de anticipación) en algunos de los LALR(1) declaraciones de algoritmo que lo precedieron a
publicación. Deben tomarse el tiempo para buscar ese documento, así como los datos relevantes actuales.
trabajo, particularmente el de Aho.

El −b Se agregó la opción para proporcionar un método portátil para permitir yacc para trabajar en
varios analizadores independientes en el mismo directorio. Si un directorio contiene más de uno
yacc gramática, y ambas gramáticas se construyen al mismo tiempo (mediante, por ejemplo, una
paralelo para lograr programa), resultados de conflictos. Si bien la solución no es una práctica histórica,
corrige una deficiencia conocida en implementaciones históricas. Los cambios correspondientes fueron
hecho a todas las secciones que hacían referencia a los nombres de archivo y.tab.c (ahora `` el archivo de código ''),
y.tab.h (ahora `` el archivo de encabezado ''), y y.salida (ahora `` el archivo de descripción '').

La gramática para yacc La entrada se basa en la documentación de System V. La descripción textual
muestra allí que el ';' es obligatorio al final de la regla. La gramática y la
la implementación no requiere esto. (El uso de C_IDENTIFICADOR hace que se produzca una reducción en
el lugar correcto.)

Además, en esa implementación, las construcciones como %simbólico puede ser terminado por un
, pero esto no está permitido por la gramática. Las palabras clave como %simbólico podemos
también aparecen en mayúsculas, lo que de nuevo no se comenta. En la mayoría de los lugares donde '%' es usado
puede ser sustituido, y hay grafías alternativas para algunos de los símbolos
(por ejemplo, %IZQUIERDA puede ser "% <" o incluso "\ <").

Históricamente,etiqueta> puede contener cualquier carácter excepto '>', incluido el espacio en blanco, en el
implementación. Sin embargo, dado que el etiqueta debe hacer referencia a un miembro de la unión estándar ISO C, en
Las implementaciones que cumplen con la práctica deben admitir solo el conjunto de caracteres para ISO C
identificadores estándar en este contexto.

Se sabe que algunas implementaciones históricas aceptan acciones que son terminadas por un
período. Las implementaciones históricas a menudo permiten PS en nombres. Una implementación conforme
no necesita apoyar ninguno de estos comportamientos.

Decidir cuando usar % prec ilustra la dificultad de especificar el comportamiento de yacc.
Puede haber situaciones en las que gramática no es, estrictamente hablando, un error, y sin embargo
yacc no puedo interpretarlo sin ambigüedades. La resolución de ambigüedades en la gramática puede
en muchos casos se resuelve proporcionando información adicional, como el uso de %tipo or
%Unión declaraciones. A menudo es más fácil y normalmente produce un analizador más pequeño para tomar
esta alternativa cuando sea apropiado.

El tamaño y el tiempo de ejecución de un programa producido sin el código de depuración en tiempo de ejecución es
generalmente más pequeño y un poco más rápido en implementaciones históricas.

Los mensajes estadísticos de varias implementaciones históricas incluyen los siguientes tipos de
:

n/ 512 terminales, n/ 300 no terminales
n/ 600 reglas gramaticales, n/ 1500 estados
n cambiar / reducir, n reducir / reducir los conflictos reportados
n/ 350 equipos de trabajo utilizados
Memoria: estados, etc. n/ 15000, analizador n/ 15000
n/ 600 conjuntos distintos de anticipación
n cierres extra
n entradas de turno, n excepciones
n Ir a entradas
n entradas guardadas por defecto
Optimizador de espacio utilizado: entrada n/ 15000, salida n/ 15000
n entradas de la tabla, n cero
Propagación máxima: n, Desplazamiento máximo: n

El informe de tablas internas en el archivo de descripción se deja definido por la implementación
porque todos los aspectos de estos límites también están definidos por la implementación. Algunas implementaciones
pueden utilizar técnicas de asignación dinámica y no tener valores límite específicos para informar.

El formato del y.salida no se proporciona el archivo porque la especificación del formato no fue
visto para mejorar la portabilidad de las aplicaciones. La lista está destinada principalmente a ayudar a los humanos
los usuarios comprenden y depuran el analizador; uso de y.salida mediante un script de aplicación conforme
sería inusual. Además, las implementaciones no han producido resultados consistentes y no
El formato popular era evidente. El formato seleccionado por la implementación debe ser humano
legible, además del requisito de que sea un archivo de texto.

Los informes de error estándar no se describen específicamente porque rara vez se utilizan para
aplicaciones conformes y no había razón para restringir las implementaciones.

Algunas implementaciones reconocen "= {" como equivalente a '{' porque aparece en historica
documentación. Esta construcción fue reconocida y documentada como obsoleta desde hace mucho tiempo.
1978, en el referenciado Yacc: Todavía Otra Compilador-compilador. Este volumen de POSIX.1‐2008
optó por dejarlo como obsoleto y omitirlo.

Los caracteres de varios bytes deben ser reconocidos por el analizador léxico y devueltos como tokens.
No deben devolverse como literales de caracteres de varios bytes. El token error que se usa
para la recuperación de errores normalmente se le asigna el valor 256 en la implementación histórica.
Por lo tanto, el valor de token 256, que se utiliza en muchos juegos de caracteres multibyte, no es
disponible para su uso como el valor de un token definido por el usuario.

EL FUTURO DIRECCIONES


Ninguna.

Utilice yaccposix en línea utilizando los servicios de onworks.net


Servidores y estaciones de trabajo gratuitos

Descargar aplicaciones de Windows y Linux

  • 1
    itop - ITSM CMDB de código abierto
    itop - ITSM CMDB de código abierto
    Portal de operaciones de TI: un espacio abierto completo
    fuente, ITIL, servicio basado en web
    herramienta de gestión que incluye un completo
    CMDB personalizable, un sistema de asistencia técnica y
    un hombre de documentos...
    Descargar itop - ITSM CMDB OpenSource
  • 2
    Clementine
    Clementine
    Clementine es una música multiplataforma
    reproductor y organizador de bibliotecas inspirado en
    Amarok 1.4. Tiene un rápido y
    interfaz fácil de usar y le permite
    busca y...
    Descargar Clementina
  • 3
    XISMUS
    XISMUS
    ATENCIÓN: la actualización acumulativa 2.4.3 ha
    sido lanzado !! La actualización funciona para cualquier
    versión 2.xx anterior. Si actualiza
    desde la versión v1.xx, descargue y
    i ...
    Descargar XISMuS
  • 4
    facetracknoir
    facetracknoir
    Programa de headtracking modular que
    admite múltiples rastreadores faciales, filtros
    y protocolos de juego. Entre los rastreadores
    son SM FaceAPI, AIC Inertial Head
    Rastreador ...
    descargar facetracknoir
  • 5
    Código QR PHP
    Código QR PHP
    El código QR de PHP es de código abierto (LGPL)
    biblioteca para generar código QR,
    Código de barras bidimensional. Residencia en
    biblioteca libqrencode C, proporciona API para
    creando código de barras QR ...
    Descargar Código QR PHP
  • 6
    libreciv
    libreciv
    Freeciv es un programa gratuito por turnos
    juego de estrategia multijugador, en el que cada
    jugador se convierte en el líder de un
    civilización, luchando por obtener el
    objetivo final: bec ...
    Descargar Freeciv
  • Más "

Comandos de Linux

Ad