QML语法是LALR(1)吗?

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... 注:

以下是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...
注: 以下答复是根据问题中提供的资料编写的。实际上,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 {