Re: Parsing di chiavi sintattiche

#45368
Up
0
Down
::

Buongiorno.
Ammettiamo di dover gestire la seguente sintassi con la chiave extends:
`
oppure:
extends `

Mi servirebbe un comando che elabori la stringa di testo dell’utente e mi restituisca il valore del nome nel primo caso oppure i valori dei due nomi nel secondo.
La soluzione che ho pensato (e che chiarirà meglio il problema) è quella di utilizzare gli argomenti delimitati, ecco il codice:
`\documentclass{minimal}

\makeatletter
\def\extends{extends}
\def\pnn#1 #2 ){%
\def\key{#1}
\ifx\key\extends
padre=#2.
\else
Error 'extends'
\fi
}
%
\def\pn(#1 #2){%
\def\tmp{#2}
\ifx\tmp\@empty
nome=#1.
\else
nome=#1, \pnn#2)
\fi
}
%
\def\parsename#1{%
\pn(#1 )
}
\makeatother

\begin{document}

\parsename{pippo}

\parsename{pippo extends sempronio}
\end{document}`

Questo codice fa esattamente quello che desidero: ma smette di funzionare non appena l’utente prova ad inserire caratteri spazio prima od anche dopo l’argomento di\parsename

Chiedo quindi se esiste un altro modo per implementare l’idea sintattica o se è possibile farlo aggiustando il codice che fa uso della tecnica ad argomenti delimitati.
Grazie a tutti.
Roberto.

Puoi ottenere di ignorare spazi iniziali con
`\makeatletter
\def\parsename#1{\@parsename#1\@nil}
\def\@parsename{\futurelet\@let@token\@@parsename}
\def\@@parsename{%
\ifx\@let@token\@sptoken
\expandafter\@parsename
\else
\expandafter\@@@parsename
\fi}
\def\@@@parsename#1\@nil{%
\pn(#1 )%
}
\makeatother`
Per gli spazi finali credo sia un bel problemino. Ma perché una sintassi così complicata? Non è meglio una classica “chiave=valore”?

Ciao
Enrico

Go to top