Php 细枝标记解析器:如何解析带有前缀的标记?

Php 细枝标记解析器:如何解析带有前缀的标记?,php,symfony,twig,Php,Symfony,Twig,我的模板包含描述页面的细枝“标签”。这些是简单的名称/值对,如 {%role“editor”%} {%title“Foobar”%} 我可以通过一个细枝扩展和一个自定义令牌解析器很好地处理它们,如下所示: {% myapp.role "editor" %} 类RoleTokenParser扩展\Twig\u令牌解析器 { 公共函数解析(\Twig\u Token$Token) { $TokenStream=$this->parser->getStream(); $role=$TokenStr

我的模板包含描述页面的细枝“标签”。这些是简单的名称/值对,如

{%role“editor”%}
{%title“Foobar”%}
我可以通过一个细枝扩展和一个自定义令牌解析器很好地处理它们,如下所示:

{% myapp.role "editor" %}
类RoleTokenParser扩展\Twig\u令牌解析器
{
公共函数解析(\Twig\u Token$Token)
{
$TokenStream=$this->parser->getStream();
$role=$TokenStream->expect(\Twig_-Token::STRING_-TYPE)->getValue();
$TokenStream->expect(\Twig\u Token::BLOCK\u END\u TYPE);
返回新的RoleNode(['role'=>$role],$Token->getLine(),$this->getTag());
}
公共函数getTag()
{
返回“角色”;
}
}
但现在我想“前缀”名称部分如下:

{% myapp.role "editor" %}
我知道
myapp
role
之间的点是一个单独的标记。我没有去做的是告诉
TokenParser
期望得到什么。我尝试了以下方法:

/。。。
$prefix=$TokenStream->expect(\Twig_-Token::STRING_-TYPE)->getValue();
$dot=$TokenStream->expect(\Twig_-Token::标点符号_-TYPE)->getValue();
$role=$TokenStream->expect(\Twig_-Token::STRING_-TYPE)->getValue();
// ...
…但这会导致例外情况:

当my
Twig\u TokenParser::getTag()
返回myapp.role时,我得到:

[Twig\u错误\u语法]
未知标记名“myapp”。你是说第三行的“myapp.role”吗
当my
Twig\u TokenParser::getTag()
仅返回myapp时,我得到:

[Twig\u错误\u语法]
第3行的值“.”(“应为字符串”)的意外标记“标点符号”
因此,问题是:当模式是
{%myapp.role“editor”%}
时,我如何告诉
令牌解析器期望什么令牌


(顺便说一句,使用类似语法(如
{%myapp role“editor”%}
)的解决方案也是可以接受的。)

标记名中不能有点状标记

在令牌解析器中,可以引用的字符串类型是标记名的第一个参数,而不是标记名本身

类似于
{%role myapp“editor”%}
的内容可以使用以下方法进行分析:

$prefix = $TokenStream->expect(\Twig_Token::NAME_TYPE)->getValue(); // myapp
$role = $TokenStream->expect(\Twig_Token::STRING_TYPE)->getValue(); // editor

标记名中不能有点刺

在令牌解析器中,可以引用的字符串类型是标记名的第一个参数,而不是标记名本身

类似于
{%role myapp“editor”%}
的内容可以使用以下方法进行分析:

$prefix = $TokenStream->expect(\Twig_Token::NAME_TYPE)->getValue(); // myapp
$role = $TokenStream->expect(\Twig_Token::STRING_TYPE)->getValue(); // editor

标记名中不能有点刺

在令牌解析器中,可以引用的字符串类型是标记名的第一个参数,而不是标记名本身

类似于
{%role myapp“editor”%}
的内容可以使用以下方法进行分析:

$prefix = $TokenStream->expect(\Twig_Token::NAME_TYPE)->getValue(); // myapp
$role = $TokenStream->expect(\Twig_Token::STRING_TYPE)->getValue(); // editor

标记名中不能有点刺

在令牌解析器中,可以引用的字符串类型是标记名的第一个参数,而不是标记名本身

类似于
{%role myapp“editor”%}
的内容可以使用以下方法进行分析:

$prefix = $TokenStream->expect(\Twig_Token::NAME_TYPE)->getValue(); // myapp
$role = $TokenStream->expect(\Twig_Token::STRING_TYPE)->getValue(); // editor
除此之外:

我可能在标签中有一个点,但是Tigg不会把整个东西当作标签名,而是用点启动令牌流。但这很好,因为这正是我们想要的行为

您只需使用点开始解析:

// works for {% myapp.key "value" %}
$dot = $TokenStream->expect(\Twig_Token::PUNCTUATION_TYPE, '.')->getValue();
$key = $TokenStream->expect(\Twig_Token::NAME_TYPE)->getValue();
$value = $TokenStream->expect(\Twig_Token::STRING_TYPE)->getValue();
getTag()
函数必须仅返回
myapp
才能工作。

此外:

我可能在标签中有一个点,但是Tigg不会把整个东西当作标签名,而是用点启动令牌流。但这很好,因为这正是我们想要的行为

您只需使用点开始解析:

// works for {% myapp.key "value" %}
$dot = $TokenStream->expect(\Twig_Token::PUNCTUATION_TYPE, '.')->getValue();
$key = $TokenStream->expect(\Twig_Token::NAME_TYPE)->getValue();
$value = $TokenStream->expect(\Twig_Token::STRING_TYPE)->getValue();
getTag()
函数必须仅返回
myapp
才能工作。

此外:

我可能在标签中有一个点,但是Tigg不会把整个东西当作标签名,而是用点启动令牌流。但这很好,因为这正是我们想要的行为

您只需使用点开始解析:

// works for {% myapp.key "value" %}
$dot = $TokenStream->expect(\Twig_Token::PUNCTUATION_TYPE, '.')->getValue();
$key = $TokenStream->expect(\Twig_Token::NAME_TYPE)->getValue();
$value = $TokenStream->expect(\Twig_Token::STRING_TYPE)->getValue();
getTag()
函数必须仅返回
myapp
才能工作。

此外:

我可能在标签中有一个点,但是Tigg不会把整个东西当作标签名,而是用点启动令牌流。但这很好,因为这正是我们想要的行为

您只需使用点开始解析:

// works for {% myapp.key "value" %}
$dot = $TokenStream->expect(\Twig_Token::PUNCTUATION_TYPE, '.')->getValue();
$key = $TokenStream->expect(\Twig_Token::NAME_TYPE)->getValue();
$value = $TokenStream->expect(\Twig_Token::STRING_TYPE)->getValue();

getTag()
函数必须仅返回
myapp
,才能使其正常工作。

谢谢!我完全忘记了我不能期望标记名,因为它已经从令牌流中删除了。然而,基于您的解决方案,我甚至能够让它与点一起工作(见下文)这很有效,谢谢!我完全忘记了我不能期望标记名,因为它已经从令牌流中删除了。然而,基于您的解决方案,我甚至能够让它与点一起工作(见下文)这很有效,谢谢!我完全忘记了我不能期望标记名,因为它已经从令牌流中删除了。然而,基于您的解决方案,我甚至能够让它与点一起工作(见下文)这很有效,谢谢!我完全忘记了我不能期望标记名,因为它已经从令牌流中删除了。然而,基于您的解决方案,我甚至能够让它与点一起工作(见下文)