Hallo,
Richtig ist:
ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteralDas ist mir schon klar, jedoch ist der Ausdruck "ExternalID" optional. Demnach ist es doch Wurst ob dieser gültig ist:
('SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral)?
Könnte sich doch auch wie (false)? verhalten und demnach wahr sein.
Ja, kann es auch (du hast selbst den Teil in der REc. verlink, wo das gesagt wird, aber das produziert nur wohlgeformte Dokumente).
Was aber nicht sein kann ist ein Public-Identifier ohne System-Identifier. Darum geht es ja in deiner Frage:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">'
^^^^^^^ Public-Identifier ^^^^^^
Zumindest wäre das so wenn das „?“ in der EBNF-Grammatik die gleiche Bedeutung besitzt wie Thomas Meinike im Posting https://forum.selfhtml.org/?t=119334&m=765381 geschrieben hat.
Fragezeichen heisst einfach "optional".
Ein paar Beispiele:
$REG = "/((SYSTEM 'foo')|(PUBLIC 'foo' 'foo'))?/";
echo preg_match($REG, "");
- echo preg_match($REG, "blabla"); <-- muss eine Fehlermeldung zurückgeben.
- echo preg_match($REG, "SYSTEM"); <-- muss eine Fehlermeldung zurückgeben.
echo preg_match($REG, "SYSTEM 'foo'");
- echo preg_match($REG, "PUBLIC"); <-- muss eine Fehlermeldung zurückgeben.
- echo preg_match($REG, "PUBLIC 'foo'"); <-- muss eine Fehlermeldung zurückgeben.
echo preg_match($REG, "PUBLIC 'foo' 'foo'");
Ergebnis -> alle Ausdrücke sind “wahr”.
Das muss du mir aber erklären: 1,2, 3 und 4 entsprechen definitiv nicht den Regeln.
Es ist durchaus einleuchtend das die SystemID bei vorhandener PublicID vorhanden sein muss, ich möchte mich nur vergewissern das dies auch _wirklich_ so spezifiziert ist.
Es ist so spezifiziert. Es wird ja nun wirklich eindeutig vorgeschrieben:
"'PUBLIC' S PubidLiteral S SystemLiteral".
Es ligt an mir, aber ich verstehen nicht, was du daran nicht verstehst.
»»Die EBNF-Grammatik gibt diese Klarheit jedenfalls nicht. Ich habe diesbezügliche auch keine weiteren Hinweise in der Spec gefunden, habe ich da etwas übersehen oder hat mich die Logik verlassen?
OK, ich kapituliere :)
Was heisst es dass die EBFN keine klarheit gitb?
Eindeutiger kann das ja nicht sein:
ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral
Die Regel dazu:
-----------------
symbol := alternative1 | alternative2 ...
A production rule simply states that the symbol on the left-hand side of the := must be replaced by one of the alternatives on the right hand side.
The alternatives are separated by |s. (One variation on this is to use ::= instead of :=, but the meaning is the same.)
Alternatives usually consist of both symbols and something called terminals. Terminals are simply pieces of the final string that are not symbols.
-----------------
Terminals sind in diesem Fall 'SYSTEM' und 'PUBLIC'.
doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)?
^^^^^^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^^^^
symbol terminal (symbol gruppe) - optional.
Wenn es vorhanden ist, müssen die Regel für diese Symbole erfüllt sein.
'?', '*' und '+' haben in EBFN dieselbe Bedeutung wie in (SGML) DTDs.
? = 0 oder 1
* = 0 oder n
- = 1 oder n
Grüße
Thomas