QML语法是LALR(1)吗?
以下是QML语法(摘自): 是LALR(1)吗?我的程序为包含冲突项的闭包I[n]引发reduce/reduce冲突:QML语法是LALR(1)吗?,qml,grammar,lr,lalr,lr1,Qml,Grammar,Lr,Lalr,Lr1,以下是QML语法(摘自): 是LALR(1)吗?我的程序为包含冲突项的闭包I[n]引发reduce/reduce冲突: // other items here... [item ::= identifier . , {] // -> ACTION[n, {] = reduce to item [type ::= identifier . , {] // -> ACTION[n, {] = reduce to type // other items here... 注:
// other items here...
[item ::= identifier . , {] // -> ACTION[n, {] = reduce to item
[type ::= identifier . , {] // -> ACTION[n, {] = reduce to type
// other items here...
注:
以下答复是根据问题中提供的资料编写的。实际上,QML的实际实现只接受名称以大写字母开头的类型的用户声明,而属性名称必须以小写字母开头。(许多内置类型的名称也以小写字母开头。因此,这并不像在词汇扫描中根据第一个字母将标识符分为两类那么简单。内置类型和关键字仍然需要识别。)
不幸的是,我还没有找到一个明确的QML语法,甚至没有语法的正式描述。上面的评论是基于
感谢您让我注意到以上内容
语法不明确,因此解析器生成器可以正确识别reduce/reduce冲突
特别是,考虑从语法中提取的下列简化产物,其中大多数替代品都被移除以集中于冲突:
body ::= '{' attribute_assignment* '}'
attribute_assignment ::= attribute_value
attribute_value ::= method_body | item
method_body ::= '{' javascript '}'
item ::= object | identifier
object ::= type body
type ::= identifier
现在,考虑< <代码>正文> <代码> >
{ x {
我们假设解析器刚刚看到了x
,现在正在查看第二个{
,以确定要采取的操作
如果x
是一个普通标识符(无论“普通”是什么意思,那么它可以解析为项
,这是属性值
的替代项。然后第二个{
可能启动一个方法体
,它也是属性值
的替代项
另一方面,如果x
是类型
,那么我们看到的是一个对象
,它从类型主体
开始。在这种情况下,第二个{
是内部主体
的开始
因此,解析器需要决定是直接将x
转换为属性值,还是将其转换为类型
。此时无法做出决定,因为{
前瞻标记没有提供足够的信息
所以很明显,语法不是LR(1)
如果对问题域一无所知,就很难给出好的建议。如果有可能区分标识符
和类型
,也许可以通过查阅符号表,那么你可以通过使用某种词汇反馈来解决这个问题。我编辑了你的问题,以包括你所指的语法o(或至少部分)。我不清楚标识符
和值
从何而来,因为它们没有在您链接到的文件中定义;我假设它们是标记。将问题的基本内容作为链接包含在其中被认为是不好的样式。如果Github repo的所有者编辑该文件,他们可以随时进行编辑,这可能会导致错误stion和任何无意义的答案。请以后避免此类链接。谢谢!!标识符在许多情况下几乎是一个标记。此外,我假设值是一个标记。谢谢!正如您所说,它不是LR(1),因此我认为这不是QT中使用的正确的QML语法,我被github中的QML.bnf误导了。QT中使用的QML语法是一种LALR语法。QLALR是LALR语法的解析器生成器。它用于为QML()生成前端,但我找不到qml的正确语法。也许,我可以删除方法调用方法体javascript方法方法属性值和参数,它们用于支持嵌入式javascript,其余的是LR(1).我重写语法,删除无法理解其含义的标记value
,并添加一条规则lambda::='function'method_body
,并将attribute_value
修改为attribute_value::=method_call | lambda | item
,它是LR(1)。为了减少“item”与“type”之间的冲突,QML使用以下技巧:所有类型都以大写字母开头。因此,我们只需要用大写字母改写“type”规则,如type:id\u,并在grammar@mishmashru当前位置有趣。从问题和引用的语法来看,这显然不明显。你有推荐信吗nce,偶然?@mishmashru:有趣。根据rici提供的url,他发现:“注意,在这两种情况下,类型名称必须以大写字母开头,才能在QML文件中声明为QML对象类型”来自和
{ x {