2012-02-03 12 views
7

¿Cómo podría agregar una palabra clave relativamente trivial a Objective-C usando el compilador Clang? Por ejemplo, agregando un literal @yes que se mapea a [NSNumber numberWithBool:YES].Agregar palabra clave a Objective-C usando Clang

He visto el (excelente) código fuente de Clang y creo que la mayoría del trabajo que tendría que hacer es en lib/Rewrite/RewriteObjC.cpp. Existe el método RewriteObjC::RewriteObjCStringLiteral (ver enlace anterior) que hace un trabajo similar para las instancias literales NSString *.

hago esta pregunta como Clang es muy modular y no estoy seguro de qué .td (ver tablegen) archivos, archivos y .h visitante pasa AST que tendría que modificar para lograr mi objetivo.

+0

¿Por qué querrías hacerlo? ¿Quieres que tu compilador compilable solo por tu compilador ajustado? – Krizz

+4

@Krizz Para obtener más información sobre el funcionamiento interno de Clang, ¡por eso! Es un ejercicio educativo :) –

+0

Si solo quieres @sí sin sumergirte en estas partes internas de Clang, mira esto: http://stackoverflow.com/a/17837531/598057 –

Respuesta

1

Si entiendo el código del clang correctamente (todavía estoy aprendiendo, así que tenga cuidado), creo que el punto de partida para este tipo de adición sería en Parser :: ParseObjCAtExpression dentro de clang/lib/Parse/ParseObjc.cpp .

Una cosa a tener en cuenta es que la clase de analizador se implementa en varios archivos (aparentemente separados por el idioma de entrada), pero se declara completamente en clang/include/Parser.h.

Analizador tiene muchos métodos siguientes el patrón de ParseObjCAt, por ejemplo, ParseObjCAtExpression ParseObjCAtStatement ParseObjCAtDirectives etc ..

Específicamente, la línea 1779 de ParseObjc.cpp parece ser donde el analizador detecta una cadena Objective-C literal en forma de @ "foo". Sin embargo, también llama a ParsePostfixExpressionSuffix, que todavía no entiendo completamente. No he descubierto cómo sabe analizar un literal de cadena (frente a @synchronize, por ejemplo).

ExprResult Parser::ParseObjCAtExpression(SourceLocation AtLoc) { 
... 
     return ParsePostfixExpressionSuffix(ParseObjCStringLiteral(AtLoc)); 
... 
} 

Si todavía no, la visita del sonido metálico página "Getting Started" a empezar con la compilación.

Cuestiones relacionadas