Ich versuche, einen Parser für eine einfache Auszeichnungssprache mit Happy zu schreiben. Momentan habe ich Probleme mit infinit Loops und verschachtelten Elementen.Verschachtelte Parser in Happy/Endlosschleife?
Meine Markup-Sprache besteht im Wesentlichen aus zwei Elementen, einem für "normalen" Text und einem für fett/hervorgehobenen Text.
data Markup
= MarkupText String
| MarkupEmph [Markup]
Zum Beispiel kann ein Text wie Foo *bar*
sollte als [MarkupText "Foo ", MarkupEmph [MarkupText "bar"]]
analysiert bekommen.
Lexing dieses Beispiels funktioniert gut, aber die Analyse führt zu einer Endlosschleife - und ich kann nicht sehen, warum. Dies ist mein derzeitiger Ansatz:
-- The main parser: Parsing a list of "Markup"
Markups :: { [Markup] }
: Markups Markup { $1 ++ [$2] }
| Markup { [$1] }
-- One single markup element
Markup :: { Markup }
: '*' Markups1 '*' { MarkupEmph $2 }
| Markup1 { $1 }
-- The nested list inside *..*
Markups1 :: { [Markup] }
: Markups1 Markup1 { $1 ++ [$2] }
| Markup1 { [$1] }
-- Markup which is always available:
Markup1 :: { Markup }
: String { MarkupText $1 }
Was ist falsch an diesem Ansatz? Wie könnte das gelöst werden?
Aktualisierung: Entschuldigung. Lexing funktionierte nicht wie erwartet. Die Unendlichkeitsschleife war im Lexer. Es tut uns leid. :)
Update 2: Auf Wunsch Ich verwende dies als Lexer:
lexer :: String -> [Token]
lexer [] = []
lexer [email protected](c:cs)
| c == '*' = TokenSymbol "*" : lexer cs
-- ...more rules...
| otherwise = TokenString val : lexer rest
where (val, rest) = span isValidChar str
isValidChar = (/= '*')
Die infinit Rekursion aufgetreten, weil ich lexer str
hatte statt lexer cs
in dieser ersten Regel für '*'
. Habe es nicht gesehen, weil mein tatsächlicher Code etwas komplexer war. :)
Um die Vollständigkeit dieser Frage zu gewährleisten, können Sie das Vorher und Nachher Ihres Lexers posten. So können andere sehen, was schief gelaufen ist. Vielen Dank. –