2015-07-02 5 views
0

Я должен определить правило, которое выражает следующее утверждение: {x in y | х> 0}. Для первой части этого понимания «х в у», у меня есть:Выразить правило с ANTLR4

подпункт правила
FIRSTPART: Name "in" Name 

, в то время как имя может быть все.

Моя проблема в том, что я не хочу жадного поведения. Таким образом, он должен разбираться, пока "|" и затем остановитесь. Поскольку я новичок в ANTLR4, я не знаю, как этого добиться.

наилучшими пожеланиями,

+0

Является '|' 'действующий name'? – Mephy

+0

нет, он должен быть разделителем. Все {x в y | x> 0} должен представлять собой инструкцию математического понимания. Вы можете прочитать его следующим образом: «x находится в y с тем свойством, что x больше 0». Для моей грамматики я хочу разделить это утверждение. Поэтому анализатор должен прочитать первую часть «x в y», пока она не достигнет «|» а затем вторую часть «x> 0». – user3097712

+0

Но "|" это не настоящая проблема. Мне нужна такая конструкция, что ANTLR читает все, что происходит до «|». Поэтому «x в y» является лишь примером. Я хочу включить неживое поведение. Он читает все, пока «|» а затем он останавливается – user3097712

ответ

0

Обычно правила лексер/анализатор должен представлять допустимый синтаксис входного источника потока.

Оценка (и последствия) того, как источник соответствует любому правилу или субрулю, является вопросом семантики - независимо от того, соответствует ли входное значение конкретному субрулю, и должен ли он контролировать, как правило окончательно оценивается.

Как правило, семантика реализована как часть анализа древовидного ходунка. Вы можете использовать альтернативный (подпункт правила Lables #inExpr и т.д.), чтобы создать легко различимые узлы дерева для целей анализа:

comprehension : LBrace expression property? RBrace ; 
expression : .... 
       | Name In Name  #inExpr 
       | Name BinOp Name #binExpr 
       | .... 
       ; 
property  : Provided expression ; 

BinOp : GT | LT | GTE | .... ; 
Provided : '|' ; 
In  : 'in' ;