Вы можете решить эту проблему, позволив вашим подправилам возвращать несколько значений и получая доступ только к тем, кто вас интересует.
Следующая демонстрация показывает, как это сделать. Хотя это не в C, я уверен, что вы сможете настроить его так, чтобы он соответствовал вашим потребностям:
grammar Test;
parse
: sub EOF {System.out.printf("second=\%s\n", $sub.second);}
;
sub returns [String first, String second, String third]
: a=INT b=INT c=INT
{
$first = $a.text;
$second = $b.text;
$third = $c.text;
}
;
INT
: '0'..'9'+
;
SPACE
: ' ' {$channel=HIDDEN;}
;
И если вы анализируете вход "12 34 56"
сгенерированным парсером, second=34
выводится на консоль, как вы можете видеть после запуска:
import org.antlr.runtime.*;
public class Main {
public static void main(String[] args) throws Exception {
TestLexer lex = new TestLexer(new ANTLRStringStream("12 34 56"));
TokenStream tokens = new TokenRewriteStream(lex);
TestParser parser = new TestParser(tokens);
parser.parse();
}
}
Итак, ярлык из правила parse
, например $sub.INT
или $sub.$a
, для доступа к одному из трех токенов INT
, в не , к сожалению, возможно.