This is part of a series of questions which focuses on the sister project to the Abstraction Project, which aims to abstract the concepts used in language design in the form of a framework. The sister project is called OILexer, which aims to construct a parser from grammar files, without the use of code injection on matches.
Some other pages associated to these questions, related to structural typing, can be viewed here, and ease of use, found here. The meta-topic associated to an inquiry about the framework and the proper place to post can be found here.
Sto arrivando al punto in cui sto per iniziare a estrarre l'albero di analisi da una determinata grammatica, seguito da un parser di discesa ricorsiva che usa DFA per discernere i percorsi in avanti (simile al LL di ANTLR 4 (*)) , quindi ho pensato di aprirlo per ottenere informazioni.
In un compilatore di parser, quali sono le caratteristiche ideali?
Fin qui ecco una breve panoramica di ciò che è implementato:
- Modelli
- Previsione anticipata, sapendo cosa è valido in un determinato punto.
- Regola "Deliteralizzazione" prendendo i letterali all'interno delle regole e risolvendo da quale token provengono.
- Automazione non deterministico
- Automatologia deterministica
- Semplice macchina a stato lessicale per il riconoscimento di token
- Metodi di automazione dei token:
- Scansione - utile per i commenti: Commento:="/ *" Scansione ("* /");
- Sottrai - Utile per identificatori: Identificatore: = Sottrai (IdentifierBody, Parole chiave);
- Assicura che l'identificatore non accetti le parole chiave.
- Codifica: codifica un'automazione come una serie di conteggi X delle transizioni di base N.
- UnicodeEscape:="\\ u" BaseEncode (IdentifierCharNoEscape, 16, 4);
- Effettua una escape unicode in esadecimale, con 4 transizioni esadecimali. La differenza tra questo e: [0-9A-Fa-f] {4} è l'automazione risultante con Encode limita l'insieme consentito di valori esadecimali allo scope di IdentifierCharNoEscape. Quindi se lo dai \ u005c, la versione codificata non accetterà il valore. Cose come questa hanno un avvertimento serio: usare con parsimonia. L'automazione risultante potrebbe essere piuttosto complessa.
- UnicodeEscape:="\\ u" BaseEncode (IdentifierCharNoEscape, 16, 4);
Ciò che non è implementato è la generazione di CST, ho bisogno di regolare le automazioni deterministiche per mantenere il contesto appropriato per farlo funzionare.
Per chiunque sia interessato, ho caricato una bella versione stampata del modulo originale del progetto T * y♯ . Ogni file dovrebbe collegarsi a ogni altro file, ho iniziato a collegare le singole regole per seguirli, ma ci sarebbe voluto troppo tempo (sarebbe stato più semplice automatizzare!)
Se è necessario più contesto, si prega di postare di conseguenza.
Modifica 5-14-2013 : Ho scritto codice per creare grafici GraphViz per le macchine di stato in una determinata lingua. Ecco un digraph GraphViz di AssemblyPart . I membri collegati nella descrizione della lingua devono avere un rulename.txt nella relativa cartella con il digraph per quella regola. Alcune delle descrizioni della lingua sono cambiate da quando ho pubblicato l'esempio, questo è dovuto alla semplificazione delle cose sulla grammatica. Ecco un interessante immagine graphviz .