我正在为一个翻译器创建一个语法.目前,我正在try 将嵌入式函数调用实现为表达式,但是我遇到了一个问题,看不清以下规则的冲突在哪里.

情况如下,在语言中,对于向量类型的对象有某些"原生"操作,对于某些数据类型也有某些函数.例如,对于向量,有函数pop(),push(),join()等.

例如:

vect1.pop()
vect1.join()

所以我有以下规则:

expresion :     ID PUNTO POP PAREN_APERTURA PAREN_CIERRE
              | ID PUNTO INDEX_OF PAREN_APERTURA expresion PAREN_CIERRE
              | ID PUNTO JOIN PAREN_APERTURA PAREN_CIERRE

还有一些函数适用于某些类型的表达式,比如toString().

例如:

console.log(12.5.toString())
var num1 : number = 20;
console.log(num1.toString())

所以我添加了以下规则:

expresion : expresion PUNTO funcion_emb PAREN_APERTURA PAREN_CIERRE

funcion_emb     : TO_STRING
                | TO_UPPER_CASE
                | TO_LOWER_CASE

此外,还有其他用于转换值的函数,例如:

parseInt("12")
parseFloat("24.5")

有以下规则:

expresion:      PARSE_INT PAREN_APERTURA expresion PAREN_CIERRE
              | PARSE_FLOAT PAREN_APERTURA expresion PAREN_CIERRE
              | TYPE_OF expresion

问题是,它生成了一个移位/减少冲突的警告,但它没有告诉我是什么规则生成的.

看看语法,可能是下列规则引起了冲突

expresion:      expresion PUNTO funcion_emb PAREN_APERTURA PAREN_CIERRE
              | ID PUNTO POP PAREN_APERTURA PAREN_CIERRE
              | ID PUNTO INDEX_OF PAREN_APERTURA expresion PAREN_CIERRE
              | ID PUNTO JOIN PAREN_APERTURA PAREN_CIERRE
              | PARSE_INT PAREN_APERTURA expresion PAREN_CIERRE
              | PARSE_FLOAT PAREN_APERTURA expresion PAREN_CIERRE
              | TYPE_OF expresion

下面是表达式和优先级的相应规则:

precedence = (
    ('left', 'OR'),
    ('left', 'AND'),
    ('left', 'IGUAL', 'DIFERENTE'),
    ('left', 'MENOR_QUE', 'MAYOR_QUE', 'MENOR_IGUAL', 'MAYOR_IGUAL'),
    ('left', 'MAS', 'MENOS'),
    ('left', 'MULTI', 'DIV', 'MOD'),
    ('right', 'NOT', 'UMENOS'),
    ('nonassoc', 'TYPE_OF'),    
)

expresion :     expresion MAS expresion
              | expresion MENOS expresion
              | expresion MULTI expresion
              | expresion DIV expresion
              | expresion MOD expresion
              | expresion IGUAL expresion
              | expresion DIFERENTE expresion
              | expresion MENOR_QUE expresion
              | expresion MAYOR_QUE expresion
              | expresion MENOR_IGUAL expresion
              | expresion MAYOR_IGUAL expresion
              | expresion AND expresion
              | expresion OR expresion
              | PAREN_APERTURA expresion PAREN_CIERRE
              | MENOS expresion %prec UMENOS
              | NOT expresion              
              | expresion PUNTO funcion_emb PAREN_APERTURA PAREN_CIERRE
              | ID PUNTO POP PAREN_APERTURA PAREN_CIERRE
              | ID PUNTO INDEX_OF PAREN_APERTURA expresion PAREN_CIERRE
              | ID PUNTO JOIN PAREN_APERTURA PAREN_CIERRE
              | PARSE_INT PAREN_APERTURA expresion PAREN_CIERRE
              | PARSE_FLOAT PAREN_APERTURA expresion PAREN_CIERRE
              | TYPE_OF expresion
              | literal
              | ID 


funcion_emb : TO_STRING
                | TO_UPPER_CASE
                | TO_LOWER_CASE

literal : LIT_NUMBER
            | LIT_FLOAT
            | LIT_CHAR
            | LIT_BOOLEAN
            | LIT_STRING

有什么建议吗?

UPDATE:

事实上,有冲突,由于与ID PUNTO的制作.现在,我正在添加新的产品来访问对象属性.

expresion : acceso_atrib

acceso_atrib : acceso_atrib PUNTO expresion

acceso_atrib : expresion PUNTO expresion

并且我已经在语法中指定了POINT操作符的优先级和结合性.

precedence = (
    ('left', 'OR'),
    ('left', 'AND'),
    ('left', 'IGUAL', 'DIFERENTE'),
    ('left', 'MENOR_QUE', 'MAYOR_QUE', 'MENOR_IGUAL', 'MAYOR_IGUAL'),
    ('left', 'MAS', 'MENOS'),
    ('left', 'MULTI', 'DIV', 'MOD'),
    ('right', 'NOT', 'UMENOS'),
    ('nonassoc', 'TYPE_OF'),
    ('left', 'PUNTO'), # ADDED
)

然而,以下规则仍然发生冲突:

WARNING: shift/reduce conflict for PUNTO in state 43 resolved as shift


state 43

    (74) expresion -> acceso_atrib .
    (75) acceso_atrib -> acceso_atrib . PUNTO expresion

  ! shift/reduce conflict for PUNTO resolved as shift
    MAS             reduce using rule 74 (expresion -> acceso_atrib .)
    MENOS           reduce using rule 74 (expresion -> acceso_atrib .)
    MULTI           reduce using rule 74 (expresion -> acceso_atrib .)
    DIV             reduce using rule 74 (expresion -> acceso_atrib .)
    MOD             reduce using rule 74 (expresion -> acceso_atrib .)
    IGUAL           reduce using rule 74 (expresion -> acceso_atrib .)
    DIFERENTE       reduce using rule 74 (expresion -> acceso_atrib .)
    MENOR_QUE       reduce using rule 74 (expresion -> acceso_atrib .)
    MAYOR_QUE       reduce using rule 74 (expresion -> acceso_atrib .)
    MENOR_IGUAL     reduce using rule 74 (expresion -> acceso_atrib .)
    MAYOR_IGUAL     reduce using rule 74 (expresion -> acceso_atrib .)
    AND             reduce using rule 74 (expresion -> acceso_atrib .)
    OR              reduce using rule 74 (expresion -> acceso_atrib .)
    PUNTO_COMA      reduce using rule 74 (expresion -> acceso_atrib .)
    PAREN_CIERRE    reduce using rule 74 (expresion -> acceso_atrib .)
    COMA            reduce using rule 74 (expresion -> acceso_atrib .)
    CORCHETE_CIERRE reduce using rule 74 (expresion -> acceso_atrib .)
    DOS_PUNTOS      reduce using rule 74 (expresion -> acceso_atrib .)
    PUNTO           shift and go to state 87

  ! PUNTO           [ reduce using rule 74 (expresion -> acceso_atrib .) ]

推荐答案

调试这些东西的最佳方法是调用yacc.yacc(debug=True)并查看生成的文件parser.out.

    (18) expresion -> ID . PUNTO POP ( )
    (19) expresion -> ID . PUNTO INDEX_OF ( expresion )
    (20) expresion -> ID . PUNTO JOIN ( )
    (25) expresion -> ID .

你已经读了一个ID,现在就要读一个句号.语法不确定是只是移动句点,还是将ID转换为表达式. (第expression . function_emb ( )章是一种可能性,因为expression . function_emb ( )在你的语法中.

解决办法是ID PUNTO ...永远不会出现在你的语法中. 在所有这些中,它应该是expression PUNTO ...,因为pop(),等等可以在任何表达式上调用

Python相关问答推荐

如何计算列表列行之间的公共元素

列表上值总和最多为K(以O(log n))的最大元素数

如何在msgraph.GraphServiceClient上进行身份验证?

沿着数组中的轴计算真实条目

将9个3x3矩阵按特定顺序排列成9x9矩阵

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

NumPy中条件嵌套for循环的向量化

cv2.matchTemplate函数匹配失败

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

多处理队列在与Forking http.server一起使用时随机跳过项目

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

pandas:对多级列框架的列进行排序/重新排序

如何在海上配对图中使某些标记周围的黑色边框

如何在Great Table中处理inf和nans

如何在验证文本列表时使正则表达式无序?

Python—在嵌套列表中添加相同索引的元素,然后计算平均值

Pandas在rame中在组内洗牌行,保持相对组的顺序不变,

如何获得满足掩码条件的第一行的索引?

Django在一个不是ForeignKey的字段上加入'

在使用ROLING()获得最大值时,是否可以排除每个窗口中的前n个值?