ANTLR语法和选词
Grammar in ANTLR and the selected words
编辑:我更改了示例以更好地解释我想要得到的东西。
这是我的语法:
INTEGER : ' int ';
LET : [a-z] ;
cchar : LET | '-' | ' ' ;
wor : cchar+;
aaa : wor+ | wor* INTEGER wor* ;
aaa 是根。并写例如:'xx int xx int'。
我想得到一个结果:'x x int x x i n t'。只抓第一个int,下一个不要报"extraneous input"错误而是拆分成字母
我该如何解决?
这似乎如您所愿:
LET : [a-z];
INT : 'int ';
cchar : LET | '-' | ' ';
wor: cchar+;
int_string: INT;
aaa: (wor|int_string)+;
这个语法说的是:给我一个词或一个整数声明,其中整数是一个声明,如果它是 'int' 后跟一个 space 定义为词法分析器项目,其他一切是单词。
现在以下不起作用:
LET : [a-z];
INT : 'int';
cchar : LET | '-' | ' ';
wor: cchar+;
int_string: INT ' ';
aaa: (wor|int_string)+;
将 space 移动到解析器规则而不是词法分析器规则后,它无法解析 'intt',实际上是任何具有 'int' 子字符串的单词。发生这种情况是因为词法分析器部分似乎将 'int' 的任何出现都读取为 INT,甚至 wor
现在也没有将 'intt' 解析为字符串,它试图匹配 (wor int (cchar t))
并且它由于某种原因而失败,不匹配 'int' 作为单独的 cchars。
第一个示例的 wor
规则将 'intt' 解析为 (wor (cchar i) (cchar n) (cchar t) (cchar t))
。这是有道理的。第一个示例的语法在词法分析阶段无法匹配,因为词法分析规则 INT
所需的 space 字符在 'intt'.
中不存在
为什么这样做?我认为这是因为词法分析器在解析器之前运行,而解析器得到的已经是语义等价物。即使在第二个示例中用 int_string
中的 'int'
替换词法分析器规则 INT
也会产生与我期望的相同的行为 antlr 只是为该匹配生成一个隐藏的词法分析器规则。虽然不是 100% 确定。
告诉我这是否有帮助,如果我想出解决第二种情况的方法,我会进行编辑:)
编辑:我更改了示例以更好地解释我想要得到的东西。 这是我的语法:
INTEGER : ' int ';
LET : [a-z] ;
cchar : LET | '-' | ' ' ;
wor : cchar+;
aaa : wor+ | wor* INTEGER wor* ;
aaa 是根。并写例如:'xx int xx int'。 我想得到一个结果:'x x int x x i n t'。只抓第一个int,下一个不要报"extraneous input"错误而是拆分成字母
我该如何解决?
这似乎如您所愿:
LET : [a-z];
INT : 'int ';
cchar : LET | '-' | ' ';
wor: cchar+;
int_string: INT;
aaa: (wor|int_string)+;
这个语法说的是:给我一个词或一个整数声明,其中整数是一个声明,如果它是 'int' 后跟一个 space 定义为词法分析器项目,其他一切是单词。
现在以下不起作用:
LET : [a-z];
INT : 'int';
cchar : LET | '-' | ' ';
wor: cchar+;
int_string: INT ' ';
aaa: (wor|int_string)+;
将 space 移动到解析器规则而不是词法分析器规则后,它无法解析 'intt',实际上是任何具有 'int' 子字符串的单词。发生这种情况是因为词法分析器部分似乎将 'int' 的任何出现都读取为 INT,甚至 wor
现在也没有将 'intt' 解析为字符串,它试图匹配 (wor int (cchar t))
并且它由于某种原因而失败,不匹配 'int' 作为单独的 cchars。
第一个示例的 wor
规则将 'intt' 解析为 (wor (cchar i) (cchar n) (cchar t) (cchar t))
。这是有道理的。第一个示例的语法在词法分析阶段无法匹配,因为词法分析规则 INT
所需的 space 字符在 'intt'.
为什么这样做?我认为这是因为词法分析器在解析器之前运行,而解析器得到的已经是语义等价物。即使在第二个示例中用 int_string
中的 'int'
替换词法分析器规则 INT
也会产生与我期望的相同的行为 antlr 只是为该匹配生成一个隐藏的词法分析器规则。虽然不是 100% 确定。
告诉我这是否有帮助,如果我想出解决第二种情况的方法,我会进行编辑:)