Если вы посмотрите на грамматики ObjectiveC antlr v3 (http://www.antlr3.org/grammar/1212699960054/ObjectiveC2ansi.g), и многие другие популярные грамматики имеют аналогичную структуру для решения условных выражений.
conditional_expression : logical_or_expression
('?' logical_or_expression ':' logical_or_expression)? ;
constant_expression : conditional_expression ;
logical_or_expression : logical_and_expression
('||' logical_and_expression)* ;
logical_and_expression : inclusive_or_expression
('&&' inclusive_or_expression)* ;
inclusive_or_expression : exclusive_or_expression
('|' exclusive_or_expression)* ;
exclusive_or_expression : and_expression ('^' and_expression)* ;
and_expression : equality_expression ('&' equality_expression)* ;
equality_expression : relational_expression
(('!=' | '==') relational_expression)* ;
relational_expression : shift_expression
(('<' | '>' | '<=' | '>=') shift_expression)* ;
shift_expression : additive_expression (('<<' | '>>') additive_expression)* ;
additive_expression : multiplicative_expression
(('+' | '-') multiplicative_expression)* ;
multiplicative_expression : cast_expression
(('*' | '/' | '%') cast_expression)* ;
cast_expression : '(' type_name ')' cast_expression | unary_expression ;
unary_expression
: postfix_expression
| '++' unary_expression
| '--' unary_expression
| unary_operator cast_expression
| 'sizeof' ('(' type_name ')' | unary_expression) ;
unary_operator : '&' | '*' | '-' | '~' | '!' ;
Если вы прочтете это, то заметите, что они делают очень длинную цепочку условных выражений 1 к 1 от conditional_expression
до logical_or_expression
, до logical_and_expression
, до inclusive_or_expression
и до exclusive_or_expression
.
Теперь я довольно наивен, когда дело доходит до ANTLR, но это кажется мне странным способом разбора условных выражений. Кажется очень сложным, чтобы определение logical_or_expression проходило через все остальные типы условных выражений. В конце концов, какое отношение определение логического OR
имеет к побитовому сдвигу влево?
Возможно, есть лучший способ или есть конкретная причина, по которой этот метод требуется?