gpt4 book ai didi

css - Lemon Parser Generator 的歧义语法

转载 作者:行者123 更新时间:2023-11-28 11:15:35 27 4
gpt4 key购买 nike

所以基本上我想在 PHP 中解析结构 CSS 代码,使用由 PEAR 包 PHP_LexerGenerator 和 PHP_ParserGenerator 生成的词法分析器/解析器。我的目标是像这样解析文件:

selector, selector2 {
prop: value;
prop2 /*comment */ :
value;

subselector {
prop: value;
subsub { prop: value; }
}
}

只要我没有伪类,这一切都很好。伪类允许它添加 :和元素的 CSS 名称 ( [a-z][a-z0-9]* ),如 a.menu:visited .由于有点懒惰,解析器没有有效伪类的列表并接受类名的所有内容。

我的语法(忽略所有特殊情况和空格)如下所示:

document   ::= (<rule>)*

rule ::= <selector> '{' (<content>)* '}'

content ::= <rule>
content ::= <definition>

definition ::= <name> ':' <name> ';'

// h1 .class.class2#id :visited
<selector> ::= <name> (('.'|'#') <name>)* (':' <name>)?

现在,当我尝试解析以下内容时

h1 {
test:visited {
simple: case;
}
}

解析器提示,它期望一个 <name>跟随双冒号。所以它尝试读取 simple:作为<selector> (只看SO的语法高亮)

解析器无法回溯到足以尝试 <definition> 是我的错误吗?规则?还是柠檬不够强大,无法表达这一点?如果是这样,我该怎么做才能让解析器使用此语法?

最佳答案

您的问题是关于 PHP_ParserGenerator 的和 PHP_LexerGenerator .解析器生成器代码被标记为“未维护”,这是不祥的预兆。

Lemon 不接受您用于文法的句法,因此您需要阐明为什么您认为解析器生成器应该接受它。您提到了“预期 <name>”的问题跟随双冒号,但是您的语法和示例输入都没有双冒号,这很难帮助您。

我认为这个 Lemon 语法等同于你展示的那个:

document        ::= rule_list.
rule_list ::= .
rule_list ::= rule_list rule.
rule ::= selector LBRACE content_list RBRACE.
content_list ::= .
content_list ::= content_list content.
content ::= rule.
content ::= definition.
definition ::= NAME COLON NAME SEMICOLON.
selector ::= NAME opt_dothashlist opt_colonname.
opt_dothashlist ::= .
opt_dothashlist ::= dot_or_hash NAME.
dot_or_hash ::= DOT.
dot_or_hash ::= HASH.
opt_colonname ::= COLON NAME.

然而,当它被编译时,Lemon 提示 1 parsing conflicts输出文件显示:

State 2:
definition ::= NAME * COLON NAME SEMICOLON
selector ::= NAME * opt_dothashlist opt_colonname
(10) opt_dothashlist ::= *
opt_dothashlist ::= * dot_or_hash NAME
dot_or_hash ::= * DOT
dot_or_hash ::= * HASH

COLON shift 10
COLON reduce 10 ** Parsing conflict **
DOT shift 13
HASH shift 12
opt_dothashlist shift 5
dot_or_hash shift 7

这意味着它不确定如何处理冒号;它可能是“选择器”的“opt_colonname”部分,也可能是“定义”的一部分:

name1:name4 : name2:name3 ;

您的意思是允许这样的语法吗?名义上,根据语法,那应该是有效的,但是

name1:name4;

也应该有效。我认为它需要 2 或 3 个先行标记来消除这些歧义(因此您的语法不是 LALR(1) 而是 LALR(3))。

特别检查您对“选择器”的定义。

关于css - Lemon Parser Generator 的歧义语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7707733/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com