2010-04-29 8 views
8

Actualmente estoy diseñando e implementando un pequeño lenguaje de programación como un proyecto de crédito extra en una clase que estoy tomando. Mi problema es que el idioma tiene tres tipos numéricos: Largo, Doble y Fracción. Las fracciones se pueden escribir en el lenguaje como fracciones adecuadas o incorrectas (por ejemplo, "2 1/3" o "1/2"). Este hecho lleva a problemas tales como "2/3.5" (largo/doble) y "2/3" (largo/largo) que no maneja correctamente el lexer. La mejor solución que veo es cambiar el operador de división. Hasta ahora, creo que "\" es la mejor solución ya que "//" comienza los comentarios.¿Qué símbolo de operador de división escogerías?

¿Seleccionarías "\", si estuvieras diseñando el lenguaje?

¿Elegirías algo más? ¿Entonces qué?

Nota: no es posible cambiar la forma en que se escriben las fracciones.

Gracias de antemano por su ayuda,

operación -Editar-

Los operadores que actualmente son:

** (potencia)

* (multiplicar)

% (módulo)

+ (ADD)

- (restar y negación)

~ (recíproco)

! (NO)

> (mayor)

< (menos)

>= (mayor-igual)

<= (menos igual)

== (igualdad)

<> (desigualdad)

& (Y)

| (OR)

^ (XO R)

?? (null-coalesing)

= (asignación)

Nota: No me hago demandas estrictamente vinculantes por mi maestro; sin embargo, básicamente lo convencí de que podía convertir una simple calculadora de fracciones en un idioma. Cambiar la sintaxis de la fracción iría en contra de la sintaxis de la fracción de la calculadora para las fracciones, que preferiblemente se evita.

+1

¿Podría usar algo que no sea "//", como "#", para los comentarios de una línea? – outis

+0

Esa es una muy buena idea. Sin embargo, me preocupa la coherencia, ya que también apoyo los comentarios multilínea al estilo C#. – Mackenzie

+0

¿Qué pasa con los otros símbolos de teclado, como 'y $ y @? – glasnt

Respuesta

5

No estoy muy seguro de cuál es el problema, ya que no conozco la teoría de la gramática. Pero trataría de cambiar la sintaxis de fracción adecuada, p. a 2_1/3, con guión bajo en lugar de espacio.

Acerca del uso de \ como operador de división - Sin duda no me gustaría, ya que se usa en casi todos los idiomas como un carácter de escape. No recomendaría semejante sobrecarga de significados.

+0

@Gman: Bien. Retiro mi comentario. –

+1

@Robert Harvey: los identificadores válidos no comienzan con números, por lo que usar _ en una fracción literal estaría bien. la división sobrecargada encontraría más confusa. – Jimmy

+0

Me gusta la idea del subrayado, que funcionaría bastante bien con mi Lexer, pero me gustaría agotar todas las posibilidades de ahorrar espacio. – Mackenzie

6

¿Qué tal una palabra "div"?

+2

+1, no es una mala idea (el modo Pascal) pero, como mínimo, también debes usar mul para multiplicar, de lo contrario hay una inconsistencia entre los operadores. – paxdiablo

1

Si se trata de una clase, simplemente usaría una palabra clave como dividedby. De lo contrario, tendrá que averiguar qué significa / en su contexto. Realmente no hay otros personajes únicos que sean adecuados.

Tenga en cuenta, sin embargo, que su profesor puede estar pidiéndole que resuelva el problema contextual, en cuyo caso quiere que use la barra inclinada. Preguntaría.

+0

¡Dios mío, estás reinventando COBOL! – msandiford

+0

@Spong. Sí, pensé en eso. Pero * es * solo una tarea de clase. –

+0

Estoy implementando el lenguaje como un resultado indirecto de una tarea, por mi propia voluntad, pero mi profesor me está otorgando un crédito extra por ello de todos modos. Existe una gran posibilidad de que publique el idioma. Sin embargo, como creo que dijo Dennis Ritchie una vez, es poco probable que un idioma realmente encuentre muchos seguidores. – Mackenzie

1

¿Qué pasa si se requiere que el tipo de Fracción utilice un doble en todos los casos; es decir, 2.0/3.5 contra 2/3.5 Entonces no se necesita un nuevo operador.

+0

Desafortunadamente, algunos dobles no se pueden convertir con precisión en una fracción. – Mackenzie

+1

Entonces no deberías usar dobles para los denominadores. – Ponkadoodle

+0

@wallacoloo No estoy permitiendo que los dobles sean los denominadores de las fracciones. Los problemas surgen principalmente como resultado de una división larga/larga. Por ejemplo, ¿"2/3" es una fracción impropia, o es un largo dividido por otro largo? No debería haber usado "2/3.5" como ejemplo, porque actualmente no estoy soportando operaciones de división larga/doble. – Mackenzie

1

Puede adoptar la convención algo no estándar de J de % para la división (porque se parece al símbolo de división) y | para el módulo.

Pero luego tienes que buscar algo más por bit-o. Tal vez /?

0

No seleccionaré '\' porque es menos accesible que '/' en los teclados. y también, es más ampliamente utilizado. por lo que sus programadores se sentirán más en casa.

7

¿Estás permitiendo compacta si declaraciones como

condition ? trueblocks : falseblocks; 

en su gramática? De lo contrario, podría usar ':' como su operador de división. Después de todo, es el símbolo matemático estándar para la división (a mano, en papel) en muchos (¿la mayoría?) Lugares alrededor de la palabra.

+0

Actualmente, no, pero me gustaría reservar la posibilidad de agregarlo más tarde. Mi analizador está escrito a mano, y todavía no tiene soporte para operadores ternarios. – Mackenzie

+2

El uso de dos puntos de esta manera no excluye el uso de algo más para el operador ternario. Python (y, iirc, Perl) le permiten decir 'trueblock if condition else falseblock', que es una alternativa bastante defendible, por ejemplo. –

1

Evitaría \ como loco ya que confundiría las expectativas de las personas.

Me gustaría seguir adelante y usar / pero sacar el problema del lexer y en el analizador, donde será más fácil de tratar y puede emitir mensajes de error razonables.

+0

He compartido tu opinión hasta ahora. Originalmente pretendía que las fracciones funcionaran igual de largas también, pero con su adición al lenguaje crea algunas reglas de división muy extrañas (es decir, Double/Double == allowed, pero Long/Long == forbidden). – Mackenzie

1

Creo que el dos caracteres /| es una idea posible. / es la división y | parece una fracción girada 90 grados.

Si permite operadores de paréntesis o unarios, podría recomendar [2 1/2] o #1/2.

1

¿Qué tal hacer que las fracciones sean el tipo de datos primario? ¿Pensando en el operador de división como un constructor infijo?

9

La respuesta APL es & divide ;. Creo que eso es reconocible.

+3

Esa sería una gran solución, pero la mayoría de los teclados no son compatibles con ese carácter, lo que haría que el lenguaje fuera incómodo de usar. – Mackenzie

3

Otra razón para evitar el uso de \ como reemplazo de / es porque puede causar confusión sobre qué operando es el numerador y cuál es el denominador. Por ejemplo, MATLAB arithmetic operators incluyen tanto la división derecha /y división izquierda \. El valor de 1/2 es 0.5, pero el valor de 1\2 es 2. En otras palabras, / tiene el numerador a la izquierda y \ tiene el numerador a la derecha.

+2

Matlab es simplemente extraño. "Todo es una matriz", ya que un paradigma de programación es mucho más extraño que otras modas como "todo es un objeto", "todo es una función" o "todo es una cadena". – ShreevatsaR

+0

En el mundo de MATLAB, sin embargo, los dos operadores de división son necesarios. Para dos matrices, '(A^-1) * B' no es lo mismo que' B * (A^-1) '. Y constantemente hago el argumento de que MATLAB es más una calculadora programable que un lenguaje de programación de propósito general. – rlbond

+0

Guau, me encanta ese lenguaje: "división izquierda" y "división derecha". Eso es genial. Gracias por la publicacion. – djangofan

Cuestiones relacionadas