Skip to content

Instantly share code, notes, and snippets.

@AlexanderSavochkin
Last active November 23, 2015 07:14
Show Gist options
  • Save AlexanderSavochkin/2b430b17bc5cb1b4928f to your computer and use it in GitHub Desktop.
Save AlexanderSavochkin/2b430b17bc5cb1b4928f to your computer and use it in GitHub Desktop.
//Правило 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