我正在为一个翻译器创建一个语法.目前,我正在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 .) ]