Naja Funktioniertd doch nicht... Zu früh gefreut...
Ich bin jedoch zu blöd, in deinem Beispiel die Linksrekursion zu erkennen.
Die Linksrekursion liegt imo bei ZeroOrMore(content). Ohne ZeroOrMore funktioniert's, aber dann ist entsprechen natürlich auch die Verschachtelung dahin... Kann natürlich auch sein, dass ich einfach zu übermüdet bin und einfach zu dämlich dazu bin... hab die Nacht durchgemacht um das noch fertig zu bekommen.
tag_block = Delay()
content = Alternative("content", text, tag_block, empty_tag, comment_tag)
tag_block.set(Sequence("tag_block", open_tag, ZeroOrMore(content), close_tag))
xml_document = Sequence("xml_document", xml_tag,tag_block)
Da gibt es kein Problem, wenn dein Parser-Kombinator richtig funktioniert
Der sollte im wesentlichen funktionieren der war Vorgegeben... Wir sollten dabei nur die Grammatik umsetzen.... Hier mal komplett soweit:
Code: Alles auswählen
#Terminal_Symbole
blank = Token(" ")
equals = Token("=")
single_quote = Token("'")
double_quote = Token("\"")
#whitespace = Token("\n")
whitespace = RegExp("\s","whitespace")
#beliebiger Text außer "<" und ">"
text = RegExp("[a-zA-Z0-9=üöäÜÖÄß()\[\]\"\s\.,;\+\-]*","text")
#text = RegExp("[a-z]*","test")
#Bezeichner von Attributen oder Tags
#identifier = RegExp("^[^\d][a-zA-Z0-9_\-\.]*","identifier")
identifier = RegExp("[a-zA-Z][a-zA-Z0-9_\-]*","identifier")
#Attribute
attribute_value = Alternative("attribute_value",Sequence("attribute_value", double_quote, text, double_quote), Sequence("attribute_value", single_quote, text, single_quote))
attribute = Sequence("attribute", OneOrMore(blank), identifier, equals, attribute_value)
#Spezialfälle encoding und version Attribute
version_string = RegExp("\d+\.\d+","float_value")
version_attribute_value = Alternative("version_attribute_value", Sequence("version_value", double_quote, version_string, double_quote), Sequence("version_value", single_quote, version_string, single_quote))
version_attribute = Sequence("version_attribute", OneOrMore(blank), Token("version"), equals, version_attribute_value)
encoding_string = RegExp("[a-zA-Z0-9\.\-]*","encoding_string")
encoding_attribute_value = Alternative("encoding_attribute_value", Sequence("encoding_value", double_quote, encoding_string, double_quote), Sequence("encoding_value", single_quote, encoding_string, single_quote))
encoding_attribute = Sequence("encoding_attribute", OneOrMore(blank), Token("encoding"), equals, encoding_attribute_value)
#Tags
xml_tag = Sequence("xml_tag",ZeroOrMore(whitespace), Token("<?xml"), version_attribute, encoding_attribute, ZeroOrMore(attribute), ZeroOrMore(blank), Token("?>"),ZeroOrMore(whitespace))
open_tag = Sequence("open_tag",Token("<"), identifier, ZeroOrMore(attribute), Token(">"),ZeroOrMore(whitespace) )
close_tag = Sequence("close_tag",Token("</"), identifier, Token(">"),ZeroOrMore(whitespace))
empty_tag = Sequence("open_tag",Token("<"), identifier, ZeroOrMore(attribute), Token("/>"),ZeroOrMore(whitespace))
comment_tag = Sequence("comment_tag",Token("<!--"),text,Token("-->"),ZeroOrMore(whitespace))
#Tagblock (rekursiv)
tag_block = Delay()
content = Alternative("content", comment_tag, empty_tag, text, tag_block )
tag_block.set(Sequence("tag_block", open_tag, ZeroOrMore(content), close_tag))
xml_document = Sequence("xml_document", xml_tag, tag_block)
Und ich meine, wenn wir Python in der Vorlesung hätten, wäre es ja wunderbar, das Subset von Java mit dem ich mich rumschlagen muss ist einfach nur schmerzhaft
Yop Java ist bei uns auch Nummer 1. Wobei das gerade extrem ätzend ist, jeder Prof hat da so seine Präferenzen. Ich komme von PHP, Java ist die Hofsprache in der Fakkultät und ich muss mir dieses Semester Python, C++ und C# aneignen zusätzlich wurde mal kurz mit LISP gedroht (ich hoffe davon bleiben wir verschont)...
Von daher besteht kein Grund zur Eifersucht... Wobei das mit den Parserkombinatoren ein ziemlich interessantes Thema ist. Hat jedenfalls Spaß gemacht bis jetzt (nur blieb der Erfolg aus)...
Vielen Dank
Gruß, Dave
There are only 10 types of people. Those who understand binary and those who don't.