I den här artikeln introducerar vi SableCC, ett objektorienterat ramverk som genererar kompilatorer och tolkar i programmeringsspråket Java. Denna ram bygger på två grundläggande designbeslut. För det första använder ramen objektorienterade tekniker för att automatiskt bygga ett strikt typat abstrakt syntaxträd som matchar grammatiken i det kompilerade språket som förenklar es felsökning. För det andra genererar ramen treewalker klasser med hjälp av en utökad version av besökare design mönster som gör det möjligt att genomföra åtgärder på noderna i det abstrakta syntax träd med arv. Dessa två designbeslut leder till ett verktyg som stödjer en kortare utvecklingscykel för att bygga kompilatorer. För att visa hur enkelt ramverket är presenterar vi alla steg för att bygga en tolk för ett mini-BASIC-språk. Detta exempel kan enkelt ändras för att ge ett inbäddat skriptspråk i ett program. Vi ger också en kort beskrivning av större system som har implementerats med hjälp av SableCC-verktyget. Vi drar slutsatsen att användningen av objektorienterade tekniker avsevärt minskar längden på programmerarens skrivna kod, kan förkorta utvecklingstiden och nally, gör koden lättare att läsa och underhålla. Antalet datorspråk som används idag är o verwhelming. De går från allmänt syfte till mycket specialiserade, de finns i nästan alla områden av datorer. Det finns vanliga programmeringsspråk som C, F Ortran, Pascal, men också många andra språk som används i domän-speci c program. Datorspråk kan användas för att beskriva många andra saker än datorbehandling. HTML 12 eller Tex 8 används för att beskriva formaterade dokument. Ett domän-speci c språk som HL7 1 används för att utbyta hälso-och sjukvårdsinformation på ett enhetligt sätt över hela världen. Det skulle vara omöjligt att räkna upp alla användningsområden här, men det är värt att notera att dessa språk ofta är inbäddade i större system. Till exempel, många w ord processing applikationer har sina egna små makro språk för att tillåta automatisering av kommandon. I komponentbaserad utveckling används små skriptspråk för att limma ihop komponenter. På 1950-talet var skrivandet av en kompilator mycket kult. Det tog 18 år att genomföra den första FORTRAN-kompilatorn 2. Sedan dess har framsteg i teorin om kompilatorer och detta arbete delvis fått stöd NSERC. Utveckling av många kompilatorverktyg har förenklat denna uppgift i hög grad. Att skriva en kompilator är nu en genomförbar uppgift för alla programmerare med minimal kunskap om kompilatorteknik. Denna enkelhet uppnås på grund av användningen av kompilatorer kompilatorer. En kompilatorkompilator är ett program som översätter en specification till en kompilator för det programmeringsspråk som beskrivs i specificationen. Detta befriar programmeraren från bördan att skriva den lexiska och syntaktiska analyskoden. Under årens lopp har många kompilatorer utvecklats. Tillämpningsområdet för dessa verktyg varierar. Medan vissa kommer att bygga en komplett kompilator end-to-end från en specific katjon, andra kommer bara att bygga front-end av en kompilator lexer och eller parser. Det kan förefalla, vid första anblicken, som en end-to-end kompilator kompilator kommer att vara mer kraftfull. I praktiken är dock kompilatorer för avancerade kompilatorer normalt integrerade med ett allmänt programmeringsspråk. På så sätt blir det lättare att implementera komplexa datastrukturer, optimeringar och kodanalyser eftersom det görs på programmerarens modersmål. Framsida kompilatorer finns för nästan alla större programmeringsspråk som används idag. Under de senaste åren har programmeringsspråket Java T M 4 vunnit en anmärkningsvärd popularitet på Internet. Även om supercivilt Java har en syntax liknande C++, Java har också många ytterligare funktioner i moderna objektorienterade programmeringsspråk på hög nivå. Till exempel har Java en sopsamlare, en renare arvsmekanism med klasser och gränssnitt, och en rik standard plattformsoberoende bibliotek med stöd för grafiska användargränssnitt och nätverksprogrammering. En av de mest intressanta egenskaperna hos Java är portabilitet av objektkod. Java källa les sammanställs till plattform oberoende bytekod instruktioner. Vid körning, dessa bytekoder tolkas av en Java Virtual Machine 10 för att utföra den faktiska beräkningen. Vi har utvecklat SableCC, för att generera kompilatorer skrivna i Java programmeringsspråk. SableCC sitter i mitten mellan front-end och end-to-end kompilator kompilatorer. Det genererar inte bara en lexer och en parser, men det bygger också en komplett uppsättning klasser. Vårt främsta mål var att tillhandahålla en ram som skulle förenkla utvecklingen av lättskötta kompilatorer. För att uppnå detta mål följer ramverket de två följande egenskaperna: Alla datastrukturer är självbevarande. Genom att förhindra att programmeraren korrumperar datastrukturerna bidrar systemet till att minska felsökningstiden. Denna egenskap uppnås genom att strikt skriva det abstrakta syntaxträdet. Det bör vara möjligt att lägga till nya funktioner genom att lägga till olika klasser av programmerare. Detta innebär en tydlig åtskillnad mellan automatiskt genererade klasser och programmerare skrivna klasser och därmed bidrar till felsökning. Detta uppnås genom att tillhandahålla färdiga att ärvas från träd-walker klasser. Dessa klasser implementerar besöksdesign mönster för att möjliggöra användning av arv som ett sätt att lägga till åtgärder. Vi använder termen åtgärder för att hänvisa till koden skriven av en programmerare som ska utföras på specifika c noder av det abstrakta syntaxträdet. Detta dokument är organiserat enligt följande. I avsnitt 2 ger vi en hög nivå beskrivning av SableCC. I avsnitt 3 förklarar vi förhållandet mellan grammatik och ett typat abstrakt syntaxträd. I avsnitt 4 utforskar vi mönstret för besöksdesign och förklarar de få förlängningar som vi har implementerat i vårt ramverk. I avsnitt 5 använder vi SableCC för att bygga en tolk för ett mini-BASIC språk. I avsnitt 6 beskriver vi andra kompilatorer som byggts med hjälp av SableCC-verktyget. I avsnitt 7 diskuterar vi relaterade arbeten och i avsnitt 8 presenterar vi våra slutsatser. SableCC representerar resultatet av vår forskning för att utveckla en Javakompilatorkompilator som möter nya kompilatorers genomförandetrender. Mer specifikt: Moderna kompilatorer implementerar vanligtvis många pass över det kompilerade programmet. En pass kompilatorer som tidiga PASCAL kompilatorer används sällan längre. Många kompilatorer arbetar på AST Abstract Syntax Tree representation av program. När en kompilator utvecklas med tiden läggs nya analyser och optimeringar till kompilatorn. En kompilator, som en n y annan programvara, måste vara underhållsbar. För att ta itu med dessa frågor har vi utvecklat ett nytt tillvägagångssätt för kompilatorkompilatorverktyg. I vårt förhållningssätt har kompilatorns plats i utvecklingscykeln reducerats till att bara bygga upp ett första objektorienterat ramverk som enbart bygger på den lexikala och grammatiska beskrivningen av det kompilerade språket. Detta har fördelen av att begränsa rammodulerna till de fall där grammatiken i det kompilerade språket ändras. Å andra sidan har rikedomen i den genererade miljön ökat. Så, i det genererade ramverket: Parsern bygger automatiskt AST i det kompilerade programmet. Varje AST-nod är strikt inskriven, vilket säkerställer att ingen korruption förekommer i trädet. Varje analys är skriven i sin egen klass. Att skriva en ny analys kräver bara att man utökar en trädvandringsklass och tillhandahåller metoder för att utföra arbetet vid lämpliga noder. Lagring av analysinformation hålls i själva analysklassen, utanför definitionen av nodtyper. Detta säkerställer att det inte behövs någon ändring av en nodtyp när en ny analys läggs till eller tas bort från kompilatorn. Ramverket använder sig i stor utsträckning av objektorienterade designmönster för att uppnå modulär kod. Den resulterande kompilatorn blir en mycket underhållsbar kompilator. I vissa fall har vi valt goodobject-orienterad design över snabb kod. Det är vår övertygelse att med tiden blir nya processorer snabbare och minnet blir billigare, men samma gamla kodbas används ofta för att generera nya kompilatorer. Så bra programvaruteknik är viktigt på lång sikt. Vi h a har utvecklat SableCC i Java programmeringsspråk. Den körs på alla plattformar som stöder Java Development Kit 1.1 eller nyare.
SableCC REF är en parser-generator som kan generera starkt maskinskrivna abstrakta syntaxträd och trädvandrare.
SableCC, an object-oriented compiler framework
{'venue': 'Proceedings. Technology of Object-Oriented Languages. TOOLS 26 (Cat. No.98EX176)', 'journal': 'Proceedings. Technology of Object-Oriented Languages. TOOLS 26 (Cat. No.98EX176)', 'mag_field_of_study': ['Computer Science']}