Buongiorno!Come posso costruire una grammatica pulita, simile a Python in ANTLR?
Come è possibile creare una semplice grammatica ANTLR che gestisca le espressioni su più righe senza la necessità né di punto e virgola né di barre inverse?
sto cercando di scrivere un semplice DSL per le espressioni:
# sh style comments
ThisValue = 1
ThatValue = ThisValue * 2
ThisOtherValue = (1 + 2 + ThisValue * ThatValue)
YetAnotherValue = MAX(ThisOtherValue, ThatValue)
Nel complesso, voglio la mia domanda per fornire lo script con alcuni valori denominati iniziali ed estrarre il risultato finale. Tuttavia, mi sto bloccando sulla sintassi. Mi piacerebbe supportare più espressioni di linea come la seguente:
# Note: no backslashes required to continue expression, as we're in brackets
# Note: no semicolon required at end of expression, either
ThisValueWithAReallyLongName = (ThisOtherValueWithASimilarlyLongName
+AnotherValueWithAGratuitouslyLongName)
Ho iniziato con una grammatica ANTLR in questo modo:
exprlist
: (assignment_statement | empty_line)* EOF!
;
assignment_statement
: assignment NL!?
;
empty_line
: NL;
assignment
: ID '=' expr
;
// ... and so on
Sembra semplice, ma io sono già nei guai con la a capo:
warning(200): StackOverflowQuestion.g:11:20: Decision can match input such as "NL" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
Graficamente, in org.antlr.works.IDE:
ho preso a calci la grammatica in giro, ma finisco sempre con violazioni di comportamento previsto:
- Un ritorno a capo non è richiesto alla fine del file
- righe vuote sono accettabili
- Tutto in una riga da un cancelletto in avanti viene scartato come commento
- Le assegnazioni terminano con la fine della riga, non il punto e virgola
- Le espressioni possono estendersi su più righe se racchiuse tra parentesi quadre ets
Sono in grado di trovare grammatiche ANTLR di esempio con molte di queste caratteristiche. Trovo che quando li abbasso per limitare la loro espressività a ciò di cui ho bisogno, finisco per rompere qualcosa. Gli altri sono troppo semplici e li rompo mentre aggiungo espressività.
Quale angolo devo prendere con questa grammatica? Puoi indicare esempi che non sono linguaggi completi o completi di Turing?
Ora ho bisogno di capire come ottenere il tokenizer per fare questo sollevamento pesi. Tornando alla documentazione, immagino. :) –
John, mi sfugge ancora. Qual è la sintassi della grammatica ANTLR in modo che il tokenizzatore inserisca NL prima di EOF? –
+1 Per finire sempre con una nuova linea, rende le cose molto più pulite. Grazie. – Craz