module languages/php/common/Tags
exports
%% Introduces the tags for PHP. It also defines the characters surrounding open
%% and close tags.
sorts PHPOpenTag PHPCloseTag PHPEchoOpenTag
context-free syntax
%% Five different types of open tags and only 1 close tag.
' -> PHPOpenTag {cons("FullOpenTag")}
"" -> PHPOpenTag {cons("ShortOpenTag")}
"<%" -> PHPOpenTag {cons("ASPOpenTag")}
"=" -> PHPEchoOpenTag {cons("EchoOpenTag")}
"?>" -> PHPCloseTag {cons("CloseTag")}
"%>" -> PHPCloseTag {cons("ASPCloseTag")}
sorts InlineHTMLChar InlineHTMLChars NonOpenTag
lexical syntax
%% We are not interested in the stuff that is not between php-tags.
%% Everything is parsed 'as-is'.
~[\<] -> InlineHTMLChar
InlineHTMLChar+ -> InlineHTMLChars {cons("Literal")}
"<" ~[\?\%] -> NonOpenTag {cons("Literal")}
lexical restrictions
InlineHTMLChars -/- ~[\<]
PHPOpenTag -/- ~[\ \n\r\t]
%% Full open tag must not be recognized as a short and a constant
"" -/- [pP]
sorts InlineHTML InlineEcho Semicolon Expr InlineHtmlPart
context-free syntax
%% Everything that is not between normal open and close tags is
%% considered HTML, including the InlineEcho.
PHPEchoOpenTag Expr Semicolon PHPCloseTag -> InlineEcho {cons("InlineEcho")}
InlineHTMLChars -> InlineHtmlPart {cons("Literal")}
NonOpenTag -> InlineHtmlPart {cons("Literal")}
InlineEcho -> InlineHtmlPart
%% Layout is not allowed between the parts.
syntax
<InlineHtmlPart-CF>* -> <InlineHTML-CF>