点 (.) 消歧是 Flex/Bison
Dot(.) disambiguation is Flex/Bison
在我的 Flex 词法分析器中,我定义了两个包含一个点的不同标记:
- 浮点数:
{DIGIT}+\.{DIGIT}+
(第一个)
- 点本身:
.
现在,我需要什么单点令牌?因为我正在为其编写语法的语言支持 .
-索引,例如:someObject.someField
或 someObject.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。
在我的 Flex 词法分析器中,我定义了两个包含一个点的不同标记:
- 浮点数:
{DIGIT}+\.{DIGIT}+
(第一个) - 点本身:
.
现在,我需要什么单点令牌?因为我正在为其编写语法的语言支持 .
-索引,例如:someObject.someField
或 someObject.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。