Last active
November 23, 2015 07:14
-
-
Save AlexanderSavochkin/2b430b17bc5cb1b4928f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Правило ELEMENT -> elementToken | |
//Находит символ химического элемента, возвращает | |
//соответствующий объект класса Element | |
ChemSubStructure Element(): {Token t;} { | |
t = <ELEMENT> { return new Element( t.image ); } | |
} | |
//Правило ELEMENTARYGROUP -> elementaryGroupToken | |
//Находит "стандартную" группу атомов (SO4, CO3, OH), | |
//возвращает соответствующий объект класса ElementaryGroup | |
ChemSubStructure ElementaryGroup(): {Token t;} { | |
t = <ELEMENTARYGROUP> { return new ElementaryGroup( t.image); } | |
} | |
//Правило GROUP -> '(' FORMULA ')' | |
//"Группа" - это формула заключённая в скобки | |
ChemSubStructure Group(): {ChemSubStructure e;} { | |
"(" e = Formula() ")" { return new Group(e); } | |
} | |
//Правило | |
//Терм - это либо группа после которой может идти число, либо элемент | |
//после которого может идти число, либо элементарная групп | |
//Символ "|" обозначает "или" - выбор одной из альтернатив. | |
//Вопросительный знак "?" обозначает "опциональность": <NUM>? значит что | |
//в данном месте может быть, а может и не быть число | |
ChemSubStructure Term(): {ChemSubStructure e; Token n = null;} { | |
e = Group() (n = <NUM>)? { return new Term(e, n == null ? 1 : Integer.parseInt(n.image)); } | |
| | |
e = Element() (n = <NUM>)? { return new Term(e, n == null ? 1 : Integer.parseInt(n.image)); } | |
| | |
e = ElementaryGroup() { return new Term(e); } | |
} | |
//Правило FORMULA -> TERM* | |
//Это правило значит что "формула" - это несколько идущих подряд "термов". | |
//Символ * означает несколько повторений | |
ChemSubStructure Formula(): {ChemSubStructure e; Formula f;} { | |
e = Term() { f = new Formula(e); } ( e = Term() { f.add(e); } )* { return f; } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment