点 (.) 消歧是 Flex/Bison

Dot(.) disambiguation is Flex/Bison

在我的 Flex 词法分析器中,我定义了两个包含一个点的不同标记:

现在,我需要什么单点令牌?因为我正在为其编写语法的语言支持 .-索引,例如:someObject.someFieldsomeObject.3(其中 3 是数组索引)。

问题是当我使用二维数组对其进行测试时,例如:someArray.0.1.

语法读作:ID DOT FLOAT 而我显然想要 ID DOT(INTEGER DOT INTEGER) 阅读。

解决方法是什么?

这是 Bison 语法的相关部分:

keypath                 :   ID DOT ID                                                           
                        |   ID DOT INTEGER                                                      
                        |   ID DOT inline_call                                                  
                        |   inline_call DOT ID                                                  
                        |   inline_call DOT INTEGER                                             
                        |   inline_call DOT inline_call                                         
                        |   keypath[previous] DOT ID                                            
                        |   keypath[previous] DOT INTEGER                                       
                        |   keypath[previous] DOT inline_call 
                        ;

number                  :   INTEGER                                                             
                        |   REAL                                                                
                        ;

推迟识别浮动的决定可能会有所帮助,我举了一个简单的例子来理解

解析器规范:

 %{
    #include<stdio.h>
    #include<stdlib.h>
  %}
  %token ID INT DOT
 %%
 Sd   : S'\n' { printf("accepted"); exit(0);}
      | R'\n' { printf("other purpose accepted"); exit(0);}
      ;
 S  : S DOT ID  {} 
    | S DOT INT {} 
    | ID        {}
    ;
 R  : INT DOT INT {printf("real number"); }
    ;
 %%

int main(){

yyparse();

return 0;

}

Lex 规范:

 %{
   #include "d.tab.h"
 %}
 %%
 [0-9]+           {  return INT;}
 [a-zA-Z][A-Za-z0-9]* { return ID;}
 "."                { return DOT;}
 .|\n              { return *yytext;}
%%

现在它可以识别 s.2.3。