header{ package joji.rsys; import java.awt.*; import joji.util.*; import joji.rsys.classwork.*; import java.util.*; } class DefParser extends Parser; options { importVocab = DefLexer; k=1; } { public void reportError(RecognitionException ex) { DefElm.semanticError = true; super.reportError(ex); Def.reportError(ex); } } rTransparent : ( rStatement )* TRANSPARENT_CLOSE { Def.transparentClose() ; } ; rStart : ( rStatement )* rSystem { DefSys.initializeWindow(); } ( rBlock ) EOF ; rRead : ( rStatement | rSection | rSystem )* ; rBlock : ( rStatement | rSection )* ; rStatement : rAssign SEMI | rCommand SEMI | "debug" t1:VAR { DefSys.debug(t1.getText()); } SEMI | rIf | rShow SEMI | rExit | SEMI ; rExit : "exit" rArg0 { Def.exit = true; Def.skip(TK_EXIT); } ; rIf : "if" rCond ; rFi : "fi" { if(Def.exit) Def.skip(TK_EXIT); } ; rCond { boolean c=false; } : c=rCondVal ( {!c}? { Def.skip(TK_THEN); } ( "then" /* fake LA */ | "elif" rCond | "else" rBlock rFi | rFi ) | {c}? ( "then" rBlock )? { Def.skip(TK_ELIF); } rFi ) ; rCondVal returns [ boolean c = false ] { DefElm v1, v2; } : v1=rExpr ( EQUAL v2=rExpr { c = v1.equals(v2); } | NOTEQ v2=rExpr { c = !v1.equals(v2); } | { c = v1.getBoolean(); } ) | NOT v1=rExpr { c = !v1.getBoolean(); } ; //////////////// rAssign { DefElm v2 = null; DefElmVar r; } : r=rVariable EQ v2=rExpr { r.setElm(v2);} ; rExpr returns [ DefElm r=DefElm.NIL ] { DefElm v2 = null; } : r=rLitOrVar ( { r=r.getElmIfVar(); } r=rAddExpr[r] | { r=r.getElmIfVar(); } ) ; rAddExpr[ DefElm a] returns [ DefElm r = a ] { DefElm v2=null; int i1, i2; } : ( PLUS v2=rPrimary { r = r.add(v2); } )+ | AND v2=rPrimary { i1 = r.getInt(); i2 = v2.getInt(); r = DefElmInteger.create(i1 & i2); } | MINUS v2=rPrimary { i1 = r.getInt(); i2 = v2.getInt(); r = DefElmInteger.create(i1-i2); } | STAR v2=rPrimary { i1 = r.getInt(); i2 = v2.getInt(); r = DefElmInteger.create(i1*i2); } ; rCommand { DefElm v1=null, v2=null; } : "wakeonlan" LPAR v1=rExpr COMMA v2=rExpr RPAR { DefSys.functionWakeOnLan(v1, v2); } ; rFunction returns [ DefElm r=DefElm.NIL ] { DefElm v1=null, v2=null; } : "ask" v1=rArg1 { r=DefSys.functionAsk(v1); } | "exist" "file" v1=rArg1 { r=DefSys.functionExistFile(v1); } | "host" rArg0 { r=DefSys.functionHost(); } | "int" v1=rArg1 { r=DefSys.functionInt(v1); } | "receive" v1=rArg1 { r=DefSys.functionReceive(v1); } | "room" rArg0 { r=DefElmString.create(Sys.RESSYS_THIS_ROOM); } | "time" rArg0 { r=DefSys.functionTime(); } ; rArg0 : LPAR RPAR ; rArg1 returns [ DefElm r = null ] : LPAR r=rExpr RPAR ; rPrimary returns [ DefElm r=DefElm.NIL ] { DefElm v2 = null; int i1; } : r=rLit | v2=rVariable { r=v2.getElm(); } ; rLitOrVar returns [ DefElm r = null ] : r=rLit | r=rVariable | r=rFunction ; rLit returns [ DefElm r = null ] { int i1, i2, i3; } : r=rLitStr | r=rLitInt | "true" { r = DefElm.ONE.dup(); } | "false" { r = DefElm.ZERO.dup(); } | "color" LPAR i1=rInteger COMMA i2=rInteger COMMA i3=rInteger RPAR { r = DefElmColor.create(i1, i2, i3); } ; rDim returns [ DefDim dim = new DefDim() ] { int i1=0, i2=0; } : LPAR i1=rInteger COMMA i2=rInteger RPAR { dim.w = i1; dim.h = i2; } ; rLitInt returns [ DefElm r = null ] : t1:INT { r = DefElmInteger.create(t1.getText()); } | t2:MINT { r = DefElmInteger.create(t2.getText()); } | t3:HEX { r = DefElmInteger.createHex(t3.getText()); } | t4:MHEX { r = DefElmInteger.createMHex(t4.getText()); } ; rLitInteger returns [ int i = 0 ] { DefElm v; } : v=rLitInt { i = v.getInt(); } ; rLitStr returns [ DefElm r = null ] : t1:STR { r = DefElmString.create(t1.getText()); } ; rLitString returns [ String s="" ] { DefElm v; } : v=rLitStr { s = v.getString(); } ; rInteger returns [ int i = 0 ] { DefElm v; } : v=rExpr { i = v.getInt(); } ; rForceInteger returns [ int i = 0 ] { DefElm v; boolean error = false; } : v=rExpr { try{ error = DefElm.semanticError; // save current error i = v.getInt(); } catch(SemanticException e){ DefElm.semanticError = error; // restore error try { i = (new Integer(v.getString())).intValue(); } catch(NumberFormatException e2){ throw DefElm.semanticError("NumberFormatException"); } } } ; rName returns [ String n="" ] { DefElmVar v; } : v=rVariable { if(v != null) n = v.getName(); } ; rString returns [ String s="" ] { DefElm v; } : v=rExpr { if(v != null) s = v.getString(); } ; rStringVector returns [ Vector v=new Vector() ] { String s; } : s=rString { v.add(s); } ( COMMA s=rString { v.add(s); })* ; rShow { DefElm v; SysLog log=null;} : ( "show" { log = new SysLog(); } | "log" { log = new SysLog(true); } ) ( v=rExpr { log.log(v.toString()); } | COMMA { log.log(" "); } )* { log.logln(); } ; rVariable returns [ DefElmVar r = null ] { DefElm s; } : t1:VAR { String name = t1.getText(); if(DefElm.isSysVar(name)){ try{ r = DefElmSysVar.create(name); } catch(SemanticException e){ r = DefElm.UNDEF; throw e; } }else{ r = DefElmWrkVar.create(name); } } | "var" s=rArg1 { r=DefSys.functionVar(s); } ; /* section */ rSection { VideoSwitch videoSwitch; Enquete enquete; DefElm v1; int i1; String n1; } : ( "control" "begin" rControl | "dio" "begin" rDio | "enquete" ( v1=rVariable "begin" enquete=rEnquete[v1] { DefSys.enqueteList.addElement(enquete); } | "default" "begin" rEnqueteDefault ) | "icon" "begin" rIconList | "initial" "connection" "begin" rVideoConnection[Sys.videoSwitch] | "monitor" "layout" "begin" rMonitorLayout | "navigation" "begin" rNavigation | "pc" "presentor" "begin" rPcPresentor | "presentor" "begin" rPresentor | "projector" "begin" rProjector | "rgb" "switch" "begin" rRgbSwitch | "room" ( "camera" "begin" rRoomCamera | "list" "begin" rRoomList { DefSysRoom.roomListEnd(); } | n1=rString "begin" rRoom[n1] ) | "tracking" "begin" rTracking | "video" ( "input" "layout" "begin" rVideoInputLayout | "selector" "begin" rVideoSelector | "switch" "begin" ( { Sys.videoSwitch == null }? videoSwitch=rVideoSwitch[null, Sys.RESSYS_THIS_ROOM] { Sys.videoSwitch = videoSwitch; } | rVideoSwitchAppend[Sys.videoSwitch] ) ) ) "end" | "student" rStudent ; /* system */ rSystem : "system" "begin" ( rSystemEntry SEMI )* "end" { DefSys.systemEnd(); } ; rSystemEntry { DefElm v1; String s1;} : "frame" COLON "top" "menu" { Sys.FRAME_STYLE = 0; } | "remote" "room" { Sys.RESSYS_REMOTE_NODE = true; } | "codec" s1=rHost { Sys.RESSYS_CODEC_HOST = s1; } ; /* control */ rControl { boolean b1 = false; } : ( b1=rNot rControlEntry[b1] SEMI )* ; rControlEntry[boolean b1] { DefElm v1; DefElmVar var1, var2; String s1; int i1, time; } : "allow" ( "connection" "at" "switch" "panel" { Sys.ALLOW_CONNECTION_AT_SWITCH_PANEL = b1; } | "speaking" "on" "request" { Sys.AUTO_ALLOW_SPEAKING = b1; } ) | "answer" ( "record" "dir" COLON s1=rString { Sys.ANSWER_DIR = s1; } | "table" COLON s1=rString { Sys.ANSWER_TABLE_FILE = s1; } ) | "attendance" ( "record" "dir" COLON s1=rString { Sys.ATTENDANCE_DIR = s1; } | "table" COLON s1=rString { Sys.ATTENDANCE_TABLE_FILE = s1; } ) | "attendant" COLON ( "list" ( "only" { Sys.ATTEND_MODE = Sys.ATTEND_BY_LIST_MODE; } | "plus" { Sys.ATTEND_MODE = Sys.ATTEND_BY_LIST_PLUS_MODE; } ) | "anonymous" { Sys.ATTEND_MODE = Sys.ATTEND_ANONYMOUSE_MODE; } ) | "button" "time" COLON i1=rInteger { SButton.deadTime = i1; } | "camera" "cycle" "time" COLON time=rInteger { Sys.CAMERA_CYCLE_TIME = time; } | "connect" "video" "by" "selection" { Sys.VIDEO_SWITCH_PRO = b1; } | "monitor" "show" "direct" "input" { Sys.MONITOR_REAL_INPUT = b1; } | "panel" "association"{ Sys.DETAIL_PANEL_ASSOCIATION = b1; } | "shutdown" "at" "exit" { Sys.RESSYS_SHUTDOWN_ON_EXIT = b1; } | "student" "file" COLON s1=rString { Sys.STUDENT_OUTPUT_FILE = s1; } | "show" ( "answer" "record" "filename" { Classwork.showAnswerRecordOutputMessage = b1; } | "attendance" "record" "filename" { Classwork.showAttendanceRecordOutputMessage = b1; } | "level" i1=rInteger { Sys.VIDEO_SOURCE_SHOW_LEVEL = i1; } | "navigation" { Sys.NAVIGATION_USER = b1; } | "video" ( "connect" "panel" { Sys.SHOW_VIDEO_FINE_CONTROL = b1; } | "selector" "panel" { Sys.SHOW_SELECTOR_CONTROL = b1; } ) ) | "terminate" "remote" "room" "at" "exit" { Sys.RESSYS_TERMINATE_ON_EXIT = b1; } | "zoom" "on" "speaking" { Sys.AUTO_ZOOM = b1; } | "unsaved" "answer" COLON ( "save" { Sys.ENQUETE_SAVE_MODE = Sys.ENQUETE_SAVE_AUTO ; } | "ask" { Sys.ENQUETE_SAVE_MODE = Sys.ENQUETE_SAVE_ASK ; } | "discard" { Sys.ENQUETE_SAVE_MODE = Sys.ENQUETE_SAVE_NO ; } ) ; rAudioMixer[AudioMixerControl audioMixerControl] : ( rAudioMixerEntry[audioMixerControl] SEMI )* ; rAudioMixerEntry[AudioMixerControl audioMixerControl] { Object drv; int port; int i1; int no = 0; String name; } : drv=rDriver { audioMixerControl.audioMixer = (IAudioMixer)drv; } | port=rPort { audioMixerControl.port = port; } | "initial" COLON i1=rInteger { audioMixerControl.initialSceneNo = i1; } | "channels" COLON { DefSys.audioChannelBegin(); } ( name=rString { DefSys.audioChannel(name); } )* { audioMixerControl.channelName = DefSys.audioChannelEnd(); } ; rCodecEntryInput[ClassroomAttribute attr, int group] { Vector v=null;} : v=rStringVector { attr.codec.setStaticInput(v, group); } ; rCodecEntryOutputIcon[ClassroomAttribute attr, int group] { String label; Image image; } : label=rString SLASH image=rImage { attr.codec.setOutputIcon(label, image, group); } ; rDio { Object drv;} : drv=rDriver SEMI { Sys.dio = (Dio)drv; } ( rDioEntry SEMI )* ; rDioEntry { int i1=0, i2=0; } : "request" "flicker" { Sys.requestFlicker.dio = Sys.dio; } COLON i1=rChannel { Sys.requestFlicker.channel = i1; } ( COMMA "interval" i2=rInteger { Sys.requestFlicker.intervalMsec = i2; } )? | "alarm" COLON i1=rChannel { Sys.dio.alarmChannel = i1; } | "send" "voice" "sensor" { Sys.voiceSensorSend.dio = Sys.dio; } COLON i1=rChannel { Sys.voiceSensorSend.channel = i1; } | "receive" "voice" "sensor" { Sys.voiceSensorReceive.dio = Sys.dio; } COLON i1=rChannel { Sys.voiceSensorReceive.channel = i1; } | ( "left" { i1=0; } | "right" { i1=1; } ) "projector" "button" COLON i2=rChannel { DefSys.projectorButton(i1, i2); } ; rEditEnquete returns [ Enquete enquete=null ] { DefElm id; } : "enquete" id=rVariable "begin" enquete=rEnquete[id] "end" ; rEnquete[DefElm id] returns [ Enquete enquete=null ] { String s1; String n1; } : { enquete = new Enquete(); enquete.id = id.getName(); } ( options { warnWhenFollowAmbig = false; } : { LA(1)!=LITERAL_title || LA(2)!=COLON }? rEnqueteAttribute[enquete] SEMI )* "title" COLON s1=rString SEMI { enquete.title = s1; } ( rEnqueteQeustion[enquete] SEMI )? ( ( rEnqueteChoice[enquete] SEMI )+ | "list" ( rEnqueteChoiceList[enquete] (COMMA)? )+ SEMI { enquete.listChoice = true; } ) ; rEnqueteDefault : ( rEnqueteAttribute[null] SEMI )* ; rEnqueteAttributeTitleFont[Enquete enquete] { int i1; } : "title" "font" "size" COLON i1=rInteger { if(enquete == null) Sys.ENQUETE_CONTENTES_TITLE_FONT_SIZE = i1; else enquete.attribute.titleFontSize = i1; } ; rEnqueteAttributeQuestionFont[Enquete enquete] { int i1; } : "question" "font" "size" COLON i1=rInteger { if(enquete == null) Sys.ENQUETE_CONTENTES_QUESTION_FONT_SIZE = i1; else enquete.attribute.questionFontSize = i1; } ; rEnqueteAttribute[Enquete enquete] { int i1; } : "choice" "font" "size" COLON i1=rInteger { if(enquete == null) Sys.ENQUETE_CONTENTES_CHOICE_FONT_SIZE = i1; else enquete.attribute.choiceFontSize = i1; } | "question" "font" "size" COLON i1=rInteger { if(enquete == null) Sys.ENQUETE_CONTENTES_QUESTION_FONT_SIZE = i1; else enquete.attribute.questionFontSize = i1; } | "title" "font" "size" COLON i1=rInteger { if(enquete == null) Sys.ENQUETE_CONTENTES_TITLE_FONT_SIZE = i1; else enquete.attribute.titleFontSize = i1; } | "gap" "before" ( "question" COLON i1=rInteger { if(enquete == null) Sys.ENQUETE_CONTENTES_GAP_BEFORE_QUESTION = i1; else enquete.attribute.gapBeforeQuestion = i1; } | "choice" COLON i1=rInteger { if(enquete == null) Sys.ENQUETE_CONTENTES_GAP_BEFORE_CHOICE = i1; else enquete.attribute.gapBeforeChoice = i1; } ) ; rEnqueteChoice[Enquete enquete] { String s1=""; EnqueteChoice choice=null; } : ( s1=rLitString )? COLON { choice = DefSys.addEnqueteChoice(enquete, s1); } ( s1=rString { choice.description.addElement(s1); } )+ ; rEnqueteChoiceList[Enquete enquete] { int i1, i2; String s1; } : i1=rLitInteger ( MINUS i2=rLitInteger { DefSys.addEnqueteChoice(enquete, i1, i2);} | { DefSys.addEnqueteChoice(enquete, i1, i1); } ) | s1=rLitString { DefSys.addEnqueteChoice(enquete, s1); } ; rEnqueteQeustion[Enquete enquete] { String s1; } : "question" ( "multiple" "choice" { enquete.multipleChoice = true; } )? COLON { enquete.question = new Vector(); } ( s1=rString { enquete.question.addElement(s1); } )+ ; rIconList { String n1; String s1; } : ( n1=rName COLON "file" s1=rString { DefSys.iconEntry(n1, s1); } SEMI )* ; rMonitorLayout { int i1=0, i2=0, i3=0; DefElmVar v1=null, v2; String s1, n1 ; MonitorLayoutComponent c1=null, c2=null, cur=null, max=null; } : { DefSys.monitorComponent = new Vector(); cur = new MonitorLayoutComponent(); max = new MonitorLayoutComponent(); } ( ( "define" v1=rVariable LARROW c1=rMonitorSize { v1.setObject(c1); } { cur.width = c1.width; cur.height = c1.height; } | "size" c1=rMonitorSize { cur.width = c1.width; cur.height = c1.height; } | "label" s1=rString { c1 = new MonitorLayoutComponent(); c1.type =IMonitorLayout.LABEL; c1.name = s1; c1.width = cur.width; c1.height = Sys.MONITOR_LABEL_HEIGHT; c1.setLocation(cur.x, cur.y, max); DefSys.monitorComponent.addElement(c1); } | "move" ( i1=rMonitorPosition[cur.x, cur.width] { cur.x = i1; } ( COMMA i2=rMonitorPosition[cur.y, cur.height] | { i2 = cur.y+cur.height; } ) | { i1 = cur.x+cur.width; } ) { cur.setLocation(i1, i2, max); } | "restore" "location" v1=rVariable { c1 = (MonitorLayoutComponent)v1.getObject(); cur.x = c1.x; cur.y = c1.y; } | "save" "location" v1=rVariable { c1 = new MonitorLayoutComponent(); c1.x = cur.x; c1.y = cur.y; v1.setObject(c1); } | v1=rVariable n1=rName { c2 = (MonitorLayoutComponent)v1.getObject(); c1 = new MonitorLayoutComponent(); if(c2 == null) throw DefElm.semanticError ("undefined component"); c1.setSize(c2); c1.name = n1; } ( "with" "label" ( s1=rString { c1.labelType = MonitorLayoutComponent.LABEL_TEXT; c1.label = s1; } | { c1.labelType = MonitorLayoutComponent.LABEL_OWN; } ) | { c1.labelType = MonitorLayoutComponent.LABEL_NONE; } ) { DefSys.monitorComponent.addElement(c1); c1.type = IMonitorLayout.MONITOR; c1.setLocation(cur.x, cur.y, max); c1.labelHeight = Sys.MONITOR_LABEL_HEIGHT; cur.width = c1.width; cur.height = c1.height; cur.borderWidth = c1.borderWidth; } ) SEMI )* { MonitorLayoutComponent.max = max; } ; rMonitorSize returns [ MonitorLayoutComponent m=null ] { int i1, i2, i3=0; DefElmVar v2;} : v2=rVariable { m = (MonitorLayoutComponent)v2.getObject(); } | ( "monitor" )? LPAR i1=rInteger COMMA i2=rInteger ( COMMA i3=rInteger )? RPAR { m = new MonitorLayoutComponent(); m.type = IMonitorLayout.MONITOR; m.setSize(i1, i2, i3); } ; rMonitorPosition[int c, int size] returns[ int x=c ] { int i1; DefElm v1; } : v1=rExpr { x = c + v1.getInt(); } | PLUS { x = c + size; } | MINUS { x = c - size; } | EQ ; rNavigation : ( rNavigationEntry SEMI )* ; rNavigationEntry { String tag; String title=null; String txt; } : tag=rString ( "title" title=rString )? txt=rString { Navigation.addNavigationEntry(tag, title, txt); } ; rPresentor { DefDim dim; String n1; String s1, s2; } : ( ( "size" COLON dim=rDim { Sys.PRESENTATION_PANEL_WIDTH = dim.w; Sys.PRESENTATION_PANEL_HEIGHT = dim.h; } | "graph" s1=rString "driver" COLON s2=rString { DefSys.graph(s1, s2); } | "input" COLON s1=rName { DefSys.presentorInputName = s1; DefSys.setPresentorConnection();} | "output" COLON s1=rName { DefSys.presentorOutputName = s1; DefSys.setPresentorConnection();} | "host" COLON ( s1=rString { Sys.PRESENTATION_SERVER = s1; } | "self" { Sys.PRESENTATION_SERVER = ""; } ) ) SEMI )+ ; rProjector { int port, mode, i1, i2; Object drv; String n1;} : drv=rDriver SEMI port=rPort { Sys.projector = DefSys.createProjector(drv, port); } ( COMMA i2=rInteger { Sys.projector2 = DefSys.createProjector(drv, i2); } )? SEMI ( ( "initial" COLON mode=rProjectorInitMode { Sys.projector.initMode = mode; } ( COMMA mode=rProjectorInitMode { Sys.projector2.initMode = mode; } )? | "ntsc" ( "input" i1=rInteger COLON n1=rName { Projector.ntscInput[i1-1] = n1; } | "output" COLON n1 = rName { Sys.projector.ntscOutput = n1; } ( COMMA n1 = rName { Sys.projector2.ntscOutput = n1; } )? ) ) SEMI )* ; rProjectorInitMode returns[ int mode=0 ] { int rgb, ntsc; } : ( rgb=rInteger { mode = Projector.initMode(rgb, 0); } ( ntsc=rInteger { mode = Projector.initMode(rgb, ntsc); } )? )? ; rRoomCamera { Object drv=null; int port=0; int number=0; int time=0; } : ( ( drv=rDriver | port=rPort | "number" COLON number=rInteger ) SEMI )* { DefSysRoom.roomCameraEnd(port, drv, number); } ; rRoomList : ( rRoomListEntry SEMI )* ; rRoomListEntry { ClassroomAttribute attr=null; String name; } : "id" COLON name=rString { attr=DefSysRoom.createRoomEntry(name); } LARROW ( rRoomListEntryAttr[attr] )* ; rRoomListEntryAttr[ClassroomAttribute attr] { String label, s1; Image image; } : label=rLabel { attr.name = label; } | s1=rHost { attr.hostname = s1; } | image=rIcon { attr.image = image; } | "codec" ( "input" ( "A" COLON rCodecEntryInput[attr, 0] | "B" COLON rCodecEntryInput[attr, 1] ) | "output" ( "A" COLON rCodecEntryOutputIcon[attr, 0] | "B" COLON rCodecEntryOutputIcon[attr, 1] ) ) ; rRoom[String id] { ClassroomAttribute attr = DefSysRoom.getRoomEntryMust(id); Vector deskVector = new Vector(); DefDeskLayout deskLayoutX = new DefDeskLayout(); DefDeskLayout deskLayoutY = new DefDeskLayout(); VideoSwitch videoSwitch=null; AudioMixerControl audioMixer=null; DefElm v3, v4; Vector list = new Vector(); DefElmVar v; String s1, n1; int i1; CameraMove cameraMove; } : ( ( deskVector=rRoomEntryDeskLayout[attr,deskLayoutX,deskLayoutY] | ( s1=rLabel | s1=rHost | "terminal" "driver" COLON s1=rString (COMMA)? { attr.nodeControllerType = s1; } ( "controller" s1=rString { attr.terminalControlHostname = s1; } | "base" "address" COLON i1=rInteger { attr.idBaseNo = i1; } )? | "zoom" "out" COLON ( cameraMove=rCameraMove (COMMA)? { list.addElement(cameraMove); } )* { DefSysRoom.zoomOutEnd(list, attr); } ) SEMI | "audio" "mixer" "begin" { if(id.equals(Sys.RESSYS_THIS_ROOM)) audioMixer = new AudioMixerControl(); else audioMixer = new AudioMixerControlRemote(); } rAudioMixer[audioMixer] { attr.audioMixerControl = audioMixer; } "end" | "video" "switch" "begin" { if(id.equals(Sys.RESSYS_THIS_ROOM)) videoSwitch = null; else videoSwitch = new VideoSwitchRemote(); } videoSwitch=rVideoSwitch[videoSwitch, id] "end" { attr.videoSwitch = videoSwitch; //System.out.println("id:"+id + " ,RESSYS_THIS_ROOM:"+Sys.RESSYS_THIS_ROOM); if(id.equals(Sys.RESSYS_THIS_ROOM)){ Sys.videoSwitch = videoSwitch; //System.out.println("id:"+id + " ,videoSwitch:"+videoSwitch); } } ) )* { DefSysRoom.classroomEnd(attr, deskVector, deskLayoutX, deskLayoutY); } ; rRoomEntryDeskLayout[ClassroomAttribute attr, DefDeskLayout layoutX, DefDeskLayout layoutY] returns [ Vector deskVector = new Vector() ] { Desk desk = null; DefDim dim=null; } : "desk" "layout" "begin" ( ( "gap" COLON dim=rDim { layoutX.gap = dim.w; layoutY.gap = dim.h; } | "origin" COLON dim=rDim { layoutX.origin = dim.w; layoutY.origin = dim.h; } | "size" COLON dim=rDim { layoutX.size = dim.w; layoutY.size = dim.h; } | "window" COLON dim=rDim { layoutX.window = dim.w; layoutY.window = dim.h; } ) (COMMA)? )* ( "group" COLON rDeskGroup[layoutX, layoutY] )? ( desk=rDeskLayout[layoutX, layoutY] (COMMA)? { if(desk!=null) deskVector.addElement(desk); } )* "end" ; rDeskGroup[DefDeskLayout layoutX, DefDeskLayout layoutY] { int i1;} : LPAR i1=rLitInteger { layoutY.init(i1); } ( i1 = rLitInteger { layoutY.add(i1); } )* COMMA i1=rLitInteger { layoutX.init(i1); } ( i1 = rLitInteger { layoutX.add(i1); } )* RPAR ; rDeskLayout[DefDeskLayout layoutX, DefDeskLayout layoutY] returns [ Desk desk=new Desk() ] { int id=0, gr=0, vc, vr, vz;} : ( "id" COLON id=rInteger { desk.id = id; } ( SLASH gr=rInteger { desk.groupNo = gr; } )? | "space" COLON { id=-1; } ) LARROW ( rDeskLayoutLoc[desk] | rDeskLayoutShow[desk, layoutX, layoutY] | rDeskLayoutZoom[desk] )* { if(id==-1) desk=null; } ; rDeskLayoutLoc[Desk desk] { DefDim dim = new DefDim(); } : "location" COLON dim=rDim { desk.column = dim.w; desk.row = dim.h; } ; rDeskLayoutShow[Desk desk, DefDeskLayout layoutX, DefDeskLayout layoutY] : "show" COLON LPAR rDeskLayoutShowLoc[layoutX] COMMA rDeskLayoutShowLoc[layoutY] RPAR { desk.x = layoutX.cur; desk.y = layoutY.cur; } ; rDeskLayoutZoom[Desk desk] { CameraMove cameraMove; } : "zoom" COLON cameraMove=rCameraMove { desk.cameraMove = cameraMove; } ; rCameraMove returns [ CameraMove cameraMove = new CameraMove() ] { int i=0; } : i=rInteger { cameraMove.mode |= CameraMove.MODE_PRESET; cameraMove.preset = i; } | LPAR i=rInteger { cameraMove.mode |= CameraMove.MODE_PAN; cameraMove.pan = i; } ( COMMA i=rInteger { cameraMove.mode |= CameraMove.MODE_TILT; cameraMove.tilt = i; } ( COMMA i=rInteger { cameraMove.mode |= CameraMove.MODE_ZOOM; cameraMove.zoom = i; } ( COMMA i=rInteger { cameraMove.mode |= CameraMove.MODE_FOCUS; cameraMove.focus = i; } )? )? )? RPAR ; rDeskLayoutShowLoc[DefDeskLayout layout] { int i; DefElm v1; } : v1=rExpr { layout.cur += v1.getInt(); } | STAR { layout.cur = layout.origin; } | EQ | MINUS { layout.cur += layout.size; } | PLUS { layout.cur += layout.size + layout.gap; } ; rPcPresentor { String s1, s2; } : s1=rHost { DefSys.pcPresentorMessengerName = s1; } ( COMMA "ether" COLON s2=rString { byte[] ether = SysUtil.etherAddr(s2); if(ether == null) throw DefElm.semanticError("etheraddress"); Sys.pcPresentor.etherAddr = ether; })? SEMI ; rRgbSwitch { Object drv;int i1; } : drv=rDriver SEMI { Sys.rgbSwitch = (RgbSwitch)drv; Sys.rgbSwitch.init(); } ( i1=rPort { Sys.rgbSwitch.setPort(i1); } SEMI )? ( rVideoSwitchChannel[Sys.rgbSwitch] SEMI )* ; rStudent { String s1; Vector vector=null; } : "text" COLON s1=rString SEMI { DefSys.studentText(s1); } | "binary" COLON s1=rString SEMI { DefSys.studentBinary(s1); } | "list" "begin" { vector = new Vector(); } ( rStudentEntry[vector] )* "end" { DefSys.studentVectorVector.addElement(vector); } ; rStudentEntry[Vector vector] { Student student = new Student(); String s1; int i1; Vector info=null; } : i1=rForceInteger { student.no = i1; } s1=rString { student.studentId = s1; } s1=rString { student.familyname = s1; } s1=rString { student.firstname = s1; } s1=rString { student.yomi = s1; } i1=rForceInteger { student.gender = i1; } ( COLON { info = new Vector(); } ( s1=rString { info.addElement(s1); } )+ { student.information = new StudentInformation(); student.information.setText(info); } )? SEMI { student.init(); vector.addElement(student); } ; rTracking : { if(Sys.tracking == null){ Sys.tracking = new Tracking(); Sys.tracking.createPosition(); } } ( rTrackingEntry SEMI )* ; rTrackingEntry { int i1; } : "count" "level" COLON i1=rInteger { Sys.TRACKING_COUNT_LEVEL = i1; } | "length" "level" COLON i1=rInteger { Sys.TRACKING_LENGTH_LEVEL = i1; } | "position" COLON rTrackingPosition ( COMMA rTrackingPosition)* | "fixed" "position" COLON rTrackingFixedPosition ( COMMA rTrackingFixedPosition)* ; rTrackingPosition { int loc; CameraMove camera; } : loc=rInteger RARROW camera=rCameraMove { int p = Sys.tracking.noofPosition; Sys.tracking.position[p] = Sys.tracking.new Position(loc, camera); Sys.tracking.noofPosition = p+1; } ; rTrackingFixedPosition { CameraMove camera; } : camera=rCameraMove { int p = Sys.tracking.noofFixedPosition; Sys.tracking.fixedPosition[p] = camera; Sys.tracking.noofFixedPosition = p+1; } ; rVideoInputLayout : { DefSys.videoInputLayout(); } ( ( rVideoInputLayoutEntry (COMMA)? )* SEMI { DefSys.videoInputLayoutRow++; DefSys.videoInputLayoutColumn = 0; } )* { DefSys.videoInputLayoutEnd(); } ; rVideoInputLayoutEntry { String n1; int level=-1;} : ( n1=rName ( SLASH level=rInteger )? { DefSys.videoInputLayoutAdd(n1, level); } | "skip" ) { DefSys.videoInputLayoutColumn++; } ; rVideoSelector : { DefSys.videoSelectorBegin(); } ( rVideoSelectorEntry SEMI )* { DefSys.videoSelectorEnd(); } ; rVideoSelectorEntry { String button; String n1, n2=null, n3=null; DefElm v1, v2, v3=null; boolean select=false, horizontal=false; int type = 0;} : ( "projector" { type = VideoSelector.PROJECTOR; } | "classwork" { type = VideoSelector.CLASSWORK; } )? "button" button=rString "select" n1=rName ( n2=rName ("horizontal" { horizontal = true; } )? )? { if(n2==null){ DefSys.videoSelector(horizontal, type, button, n1); }else{ DefSys.videoSelector(horizontal, type, button, n1, n2); } } ( rVideoSelectorAmong )? ( COMMA ( "navigation" n3=rString | "show" "at" "first" { select = true; } ) )* { DefSys.videoSelectorEntryEnd(n3, select); } ; rVideoSelectorAmong { String n1; } : "among" { DefSys.videoSelectorAmong(); } ( n1=rName { DefSys.videoSelectorAmongAdd(n1); } )+ ; rVideoSwitch[VideoSwitch inVideoSwitch, String roomId] returns [ VideoSwitch videoSwitch=inVideoSwitch ] : videoSwitch=rVideoSwitchDriver[videoSwitch] { videoSwitch.roomId = roomId; } ( rVideoSwitchEntry[videoSwitch] SEMI )* { videoSwitch.init(); } ( rVideoSwitchChannel[videoSwitch] SEMI )* ( "special" "channel" "begin" rVideoSpecialChannel[videoSwitch] "end" )? ( "initial" "connection" "begin" rVideoConnection[videoSwitch] "end" )? ; rVideoSwitchDriver[VideoSwitch inVideoSwitch] returns [ VideoSwitch videoSwitch = inVideoSwitch ] { DefElm v1; Object drv; } : { videoSwitch == null}? drv=rDriver SEMI { videoSwitch = (VideoSwitch)drv; } | ( drv=rDriver SEMI )? ; rVideoSwitchEntry[VideoSwitch videoSwitch] { String s1; int i1; } : ("output" "file")=> "output" "file" COLON s1=rString { videoSwitch.initialOutputFilename = s1; } | "input" COLON i1=rInteger ("channels")? { videoSwitch.noofInput = i1; } | "loop" COLON i1=rInteger ("channels")? { videoSwitch.noofLoop = i1; } | "output" COLON i1=rInteger ("channels")? { videoSwitch.noofOutput = i1; } | i1=rPort { videoSwitch.setPort(i1); } ; rVideoSwitchChannel[VideoSwitch videoSwitch] { int t, ch=0; String n1; VideoSwitchInput vi=null; VideoSwitchOutput vo=null; } : n1=rName COLON ( "input" ch=rInteger LARROW { vi = videoSwitch.input[ch-1]; vi.name = n1; } rVideoSwitchChannelInput[videoSwitch, vi] | "loop" ch=rInteger LARROW { vi = videoSwitch.input[videoSwitch.noofInput + ch-1]; vi.name = n1; vo = videoSwitch.output[videoSwitch.noofOutput + ch-1]; vo.name = n1; ((SoftVideoSwitchOutput)vo).cabling((SoftVideoSwitchInput)vi); } rVideoSwitchChannelLoop[vi, vo] | "output" ch=rInteger LARROW { vo = videoSwitch.output[ch-1]; vo.name = n1; } rVideoSwitchChannelOutput[vo] ) ; rVideoSwitchChannelInput[VideoSwitch videoSwitch, VideoSwitchInput vi] { String ch, id, s1; Image image; ClassroomAttribute attr = null; } : s1=rLabel { vi.label = s1; } image=rIcon { vi.image = image; } | "room" COLON id=rString { // because image is not defined for the room, use image of codec attr = DefSysRoom.getRoomEntryMust(id); // only local definition is valid if(videoSwitch.isLocal()) attr.videoInput = vi; vi.label = attr.codec.output[0].label; vi.image = attr.codec.output[0].image; } ( s1=rLabel { vi.label = s1; } )? ( image=rIcon { vi.image = image; })? | "codec" COLON ch=rString { DefSys.setCodecPort(videoSwitch, vi, ch); } ; rVideoSwitchChannelLoop[ VideoSwitchInput vi, VideoSwitchOutput vo] { String s1; Image image;} : s1=rLabel { vi.label = vo.label = s1; } image=rIcon { vi.image = image; } ; rVideoSwitchChannelOutput[ VideoSwitchOutput vo] { String s1; } : s1=rLabel { vo.label = s1; } ; rVideoSwitchAppend[VideoSwitch videoSwitch] : ( "special" "channel" "begin" rVideoSpecialChannel[videoSwitch] "end" )? ( "initial" "connection" "begin" rVideoConnection[videoSwitch] "end" )? ; rVideoConnection[VideoSwitch videoSwitch] { String n1=null, n2, s1; } : ( ( n1=rName | "codec" s1=rString // get input connected to the specified output { n1=DefSysRoom.codecInputChannel(videoSwitch, s1); } ) RARROW ( n2=rName (COMMA)? { if(n1 != null && videoSwitch != null){ videoSwitch.initialMonitorName.addElement(n2); videoSwitch.initialVideoSourceName.addElement(n1); } } )* SEMI )* ; rVideoSpecialChannel[VideoSwitch videoSwitch] : ( rVideoSpecialChannelEntry[videoSwitch] SEMI )* { DefSys.videoSpecialChannelEnd(videoSwitch); } ; rVideoSpecialChannelEntry[VideoSwitch videoSwitch] { String n1, n2; int i1; } : "zoom" "room" COLON n1=rName { videoSwitch.selectedRoom =videoSwitch.getVideoSwitchOutput(n1);} ( RARROW n2=rName { DefSysRoom.setRoomCameraConnection(videoSwitch, n1, n2);} )? ; /* common expression */ rChannel returns [int i=0] : "channel" i=rInteger ; rDriver returns [Object drv=null] { String s1; } : "driver" COLON s1=rString { drv = SysUtil.newInstanceOf(s1); } ; rHost returns [String host=null] { String s1; } : "host" COLON s1=rString { host = s1; } ; rIcon returns [Image image=null] : "icon" COLON image=rImage ; rImage returns [Image image=null] { String n1; } : n1=rName { return DefSys.getImage(n1); } ; rLabel returns [String s=null] : "label" COLON s=rString ; rNot returns [ boolean b1=true] : ( "not" { b1 = false; } )? ; rPort returns [int i=0] : "port" COLON i=rInteger ; rShowFilename returns [boolean b=false] : (COMMA)? "show" "filename" { b=true; } | ; /* record */ rAnswer returns [ AnswerRecord answerRecord=null ] { String id; int date, time; StudentRecord record; } : "answer" "record" id=rName "begin" { answerRecord = new AnswerRecord(); answerRecord.enqueteId = id; } "date" COLON date=rLitInteger SEMI { answerRecord.date = date; } "time" COLON time=rLitInteger SEMI { answerRecord.time = time; } ( record=rAnswerData { answerRecord.vector.addElement(record); } )* "end" ; rAnswerData returns [ StudentRecord record = new StudentRecord() ] { String id; int answer; } : id=rLitString COLON answer=rLitInteger SEMI { record.id = id; record.answer = answer; } ; rAttendance returns [ ClassworkRecord classworkRecord=null ] { String enquete; int date, start, stop; StudentRecord record; } : "attendance" "record" "begin" { classworkRecord = new ClassworkRecord(); } "date" COLON date=rLitInteger SEMI { classworkRecord.date = date; } "start" "time" COLON start=rLitInteger SEMI { classworkRecord.startTime = start; } "stop" "time" COLON stop=rLitInteger SEMI { classworkRecord.stopTime = stop; } ( record=rAttendanceData {classworkRecord.vector.addElement(record); } )* "end" ; rAttendanceData returns [ StudentRecord record = new StudentRecord() ] { String id, name ="", room ; int time, column, row; } : "id" COLON id=rLitString ( name=rLitString )? COMMA "time" COLON time=rLitInteger COMMA "room" COLON room=rLitString COMMA "desk" COLON column=rLitInteger row=rLitInteger SEMI { record.id = id; record.name = name; record.time = time; record.room = room; record.column = column; record.row = row; } ;